GNU/Linux >> Tutoriales Linux >  >> Linux

¿Hay algo más rápido que `find . | wc -l` para contar archivos en un directorio?

No es una aceleración fundamental, pero al menos algo :)

find . -printf \\n | wc -l

Realmente no necesita pasar la lista de nombres de archivo, solo basta con las nuevas líneas. Esta variante es aproximadamente un 15 % más rápida en mi Ubuntu 12.04.3 cuando los directorios se almacenan en memoria RAM. Además, esta variante funcionará correctamente con nombres de archivo que contengan saltos de línea.

Curiosamente, esta variante parece ser un poco más lenta que la anterior:

find . -printf x | wc -c

Caso especial, pero realmente rápido

Si el directorio está en su propio sistema de archivos, simplemente puede contar los inodos:

df -i .

Si el número de directorios y archivos en directorios distintos al contado no cambia mucho, simplemente puede restar este número conocido del df -i actual resultado. De esta manera podrás contar los archivos y directorios muy rápidamente.


He escrito ffcnt exactamente con ese propósito. Recupera el desplazamiento físico de los directorios mismos con el fiemap ioctl y luego programar el recorrido del directorio en varias pasadas secuenciales para reducir el acceso aleatorio. Si realmente obtienes una aceleración en comparación con find | wc depende de varios factores:

  • tipo de sistema de archivos:sistemas de archivos como ext4 que admiten el fiemap ioctl se beneficiará más
  • velocidad de acceso aleatorio:los HDD se benefician mucho más que los SSD
  • diseño de directorios:cuanto mayor sea el número de directorios anidados, mayor potencial de optimización

(re)montar con relatime o incluso nodiratime también puede mejorar la velocidad (para todos los métodos) cuando los accesos causarían actualizaciones de metadatos.


En realidad, en mi sistema (Arch Linux) este comando

   ls -A | wc -l

es más rápido que todos los anteriores:

   $ time find . | wc -l
  1893

   real    0m0.027s
   user    0m0.004s
   sys     0m0.004s
   $ time find . -printf \\n  | wc -l
   1893

   real    0m0.009s
   user    0m0.000s
   sys     0m0.008s
   $ time find . -printf x  | wc -c
   1893

   real    0m0.009s
   user    0m0.000s
   sys     0m0.008s
   $ time ls -A | wc -l
   1892

   real    0m0.007s
   user    0m0.000s
   sys     0m0.004s

Linux
  1. ¿Por qué un nuevo directorio tiene un recuento de enlaces duros de 2 antes de que se le agregue algo?

  2. ¿Eliminar archivos por edad?

  3. ¿Cuál es la mejor manera de contar el número de archivos en un directorio?

  4. ¿Cambiar el nombre de los archivos en el directorio?

  5. Cuente las líneas de todos los archivos en el directorio de Ubuntu

Cómo contar archivos en el directorio en Linux

Encuentre y elimine el archivo más antiguo si hay más de X archivos en un directorio en Linux

Cómo contar la cantidad de archivos y subdirectorios dentro de un directorio

Cómo contar archivos en el directorio en Linux

Contar el número de archivos en un directorio en Linux

Cómo contar el número de archivos en un directorio en Linux