Si analizar la salida de ls
es 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 find
evitar este análisis, pero de manera similar, find mydir | wc -l
se 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.
find
obtendrá el número de archivos de forma recursiva (úselo-maxdepth 1
si no lo desea.find mydir -maxdepth 1 -type f -printf \\n | wc -l
Debe 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
find
ywc
.fuente
n+1
archivos en mi sistema Debian). Tampoco filtra los archivos normales.find
comando 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 defind
no tienen-not
.-maxdepth
no 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 dotglob
porFIGNORE=.?(.)
. En zsh, reemplácelosetopt glob_dots
o elimine lashopt
llamada 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
1
para un directorio vacío cuandonullglob
no 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 dirname
no funciona si hay otros directorios dentro de ese nombredirname
. Es mejor usarlofind dirname/. ! -name .
.wc -l
cuenta 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
-b
tendrá caracteres no imprimibles,-A
se 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 -l
for
.¿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
perl
línea (reformateada para facilitar la lectura):o
Puede usar
perl
funciones que modifiquen matrices comogrep
omap
con la segunda versión. Verperldoc -f readdir
para 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 -l
fuente
\n
u otros caracteres funky (sí, ciertos dispositivos lo permiten).Además de la
find
respuesta basada en la propuesta de Stéphane , aquí hay una respuesta compatible con POSIX basada enls
:fuente