Si analizar la salida de lses peligroso porque puede romper algunos caracteres extraños (espacios \n, ...), ¿cuál es la mejor manera de saber la cantidad de archivos en un directorio?
Por lo general, confío en findevitar este análisis, pero de manera similar, find mydir | wc -lse romperá por las mismas razones.
Estoy trabajando en Solaris en este momento, pero estoy buscando una respuesta lo más portátil posible en diferentes unidades y diferentes shells.

findobtendrá el número de archivos de forma recursiva (úselo-maxdepth 1si no lo desea.find mydir -maxdepth 1 -type f -printf \\n | wc -lDebe manejar los caracteres especiales en el nombre del archivo, ya que nunca se imprimen en primer lugar.Respuestas:
¿Qué tal este truco?
Tan portátil como
findywc.fuente
n+1archivos en mi sistema Debian). Tampoco filtra los archivos normales.findcomando a sus necesidades específicas. Sí, este incluye todos los directorios, incluido.(que podría ser el motivo por el que ve el resultado comon+1).find . -maxdepth 1 ! -name . -exec echo \; | wc -l; algunas versiones anteriores defindno tienen-not.-maxdepthno es estándar (una extensión de GNU ahora también es compatible con algunas otras implementaciones).Con bash, sin utilidades externas, ni bucles:
En ksh, reemplace
shopt -s dotglobporFIGNORE=.?(.). En zsh, reemplácelosetopt glob_dotso elimine lashoptllamada y usefiles=(*(D)). (O simplemente deje caer la línea si no desea incluir archivos de puntos). Portablemente, si no le importan los archivos de puntos:Si desea incluir archivos de puntos:
fuente
1para un directorio vacío cuandonullglobno está habilitado. En zsh,a=(*(DN));echo ${#a}con el calificadorN(nullglob) no se produce un error para un directorio vacío.Debería ser bastante portátil para los sistemas posteriores a los 80.
Eso cuenta todas las entradas del directorio excepto
.y..en el directorio actual.Para contar archivos en subdirectorios también:
(ese debería ser portátil incluso para Unix V6 (1975), ya que no necesita
-prune)fuente
find dirname ! -name dirname -prune -print). Desde entonces me he estado preguntando si hay alguna razón particular para usar engrep -c /lugar dewc -l(que probablemente se usa más comúnmente para contar).find dirname ! -name dirnameno funciona si hay otros directorios dentro de ese nombredirname. Es mejor usarlofind dirname/. ! -name ..wc -lcuenta el número de líneas, los nombres de archivo pueden estar formados por varias líneas ya que el carácter de nueva línea es tan válido como cualquier otro en un nombre de archivo.Tratar:
El
-btendrá caracteres no imprimibles,-Ase mostrarán todos los archivos excepto.e.., y uno por línea (por defecto en una tubería, pero bueno para ser explícito).Siempre que estemos incluyendo lenguajes de scripting de nivel superior, aquí hay una línea en Python:
O con 'encontrar' completo:
fuente
Yoc puede usar tal construcción:
Pero me temo, puede cath error como
Argument list too long.en caso de que tenga demasiados archivos en el directorio. Sin embargo, lo probé en el directorio con 10 mil millones de archivos, y funcionó bien.fuente
*.gnu find . -maxdepth 1 -type f | wc -lfor.¿Has considerado perl, que debería ser relativamente portátil?
Algo como:
fuente
Intente esto => Usar ls con -i (para el número de nodo) y -F (agrega el nombre del directorio con las opciones '/').
fuente
Con una
perllínea (reformateada para facilitar la lectura):o
Puede usar
perlfunciones que modifiquen matrices comogrepomapcon la segunda versión. Verperldoc -f readdirpara un ejemplo usandogrep.fuente
La versión más simple que uso todo el tiempo y con la que nunca tuve problemas es:
ls -b1 | wc -lfuente
\nu otros caracteres funky (sí, ciertos dispositivos lo permiten).Además de la
findrespuesta basada en la propuesta de Stéphane , aquí hay una respuesta compatible con POSIX basada enls:fuente