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