No es raro que tenga que contar la cantidad de archivos en un directorio, a veces esto llega a millones.
¿Hay una mejor manera que simplemente enumerarlos y contarlos find . | wc -l
? ¿Hay algún tipo de llamada al sistema de archivos que pueda hacer en ext3 / 4 que requiera menos E / S?
linux
filesystems
find
ext4
MattPark
fuente
fuente
find -maxdepth 1
. Tenga en cuenta que con su enfoque actual, contará dos veces cualquier nombre que contenga un carácter de nueva línea.Respuestas:
No es una aceleración fundamental, pero al menos algo :)
Realmente no necesita pasar la lista de nombres de archivos, solo bastan 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 caché en la RAM. Además, esta variante funcionará correctamente con nombres de archivo que contengan nuevas líneas.
Curiosamente, esta variante parece ser un poco más lenta que la anterior:
Caso especial, pero muy rápido
Si el directorio está en su propio sistema de archivos, simplemente puede contar los inodos:
Si el número de directorios y archivos en directorios diferentes al contado no cambia mucho, simplemente puede restar este número conocido del
df -i
resultado actual . De esta manera podrá contar los archivos y directorios muy rápidamente.fuente
time find /usr/src/ -printf \\n | wc -l
, puede borrar los cachés entre ejecuciones consudo sync && sudo sysctl -w vm.drop_caches=3
-printf x
supone que es lo mismo que-printf '\0'
? No lo veo mencionado en los documentos.-printf
funciona de manera similar a laprintf()
función en C con la principal diferencia de que las%
directivas tienen un significado diferente. La acción se invoca para cada archivo encontrado. Esto significa que-printf x
imprimirá el carácterx
para cada archivo encontrado (¡pruébelo!)-printf '\0'
E imprimirá el carácter NULL (código ASCII 0) para cada archivo encontrado.-printf '\0'
No tiene un significado especial. Ambos funcionarán igual en el ejemplo conwc -c
en esta respuesta.He escrito ffcnt exactamente para ese propósito. Recupera el desplazamiento físico de los directorios con el
fiemap
ioctl y luego programa el recorrido del directorio en múltiples pases secuenciales para reducir el acceso aleatorio. Si realmente obtienes una aceleración en comparación confind | wc
depende de varios factores:fiemap
ioctl se beneficiarán más(re) montar con
relatime
o inclusonodiratime
puede mejorar la velocidad (para todos los métodos) cuando los accesos causarían actualizaciones de metadatos.fuente
En realidad, en mi sistema (Arch Linux) este comando
es más rápido que todo lo anterior:
fuente
/bin/ls: Argument list too long
si usa globbing, pero nuevamente puede funcionar de forma recursiva como find también, así que tal vez sea algo a considerar, no use find si no es necesario.ls -A
enumere solo los archivos en el directorio actual, mientras quefind
sin-maxdepth 1
argumento hará una búsqueda recursiva en todos los subdirectorios.