2 votos

Forma rápida de contar los archivos en una carpeta grande

Quiero contar los archivos en una carpeta, sin embargo, hay demasiados archivos, por lo que ls -1 | wc -l lleva más de unos pocos minutos. ¿Hay algún método más rápido? ¿Preferiblemente uno con menor complejidad?

Preferiría una solución que se pueda ejecutar desde la línea de comandos, sin embargo, otras soluciones seguirían siendo útiles.

Edit: La solución mencionada anteriormente no funciona en absoluto:

 $ ls -1 | wc -l
ls: memory exhausted
0
 

2voto

shashank Puntos 1

Una forma de usar encontrar y contar:

 find . -type f | wc -l
 

1voto

xenoid Puntos 126

Podrías preguntar en Python:

python -c "import glob; print len(glob.glob('*'))"

Notas:

  • Las comillas dobles y fuera de las comillas simples alrededor de patrón o vice-versa.
  • El patrón puede incluir una ruta de acceso: '/tmp/*'

Tengo la curiosidad de saber que es más rápido en comparación a find, no puedo crear una lo suficientemente grande como directorio para hacer una sensata de medición.

Por supuesto, esto también está sujeto a posibles OOM...

Edit: probado con casi 1 millón de archivos en un tmpfs:

▶▶time python -c "import glob; print len(glob.glob('*'))"
999990

real    0m0.774s
user    0m0.471s
sys     0m0.303s
▶▶time find . | wc -l
999992

real    0m0.522s
user    0m0.231s
sys     0m0.324s

Por lo find es más rápido. Por cierto, cuando funciona, ls es mucho más lento que cualquiera de los dos.

0voto

Max Matti Puntos 88

Me hizo probar algunas de las sugerencias mediante el zsh time función de:

$ time ./getdents keys | wc -l
15228414
./getdents keys  0,29s user 4,34s system 91% cpu 5,061 total
wc -l  0,11s user 0,13s system 4% cpu 5,061 total


$ time find keys -type f | wc -l
19144815
find keys -type f  10,38s user 7,82s system 3% cpu 7:42,05 total
wc -l  0,21s user 0,25s system 0% cpu 7:42,08 total


$ time ls -1 -U keys | wc -l
16986019
ls --color=tty -1 -U keys  3,88s user 6,69s system 2% cpu 7:53,60 total
wc -l  0,21s user 0,22s system 0% cpu 7:53,60 total


$ time python -c "import glob; print len(glob.glob('*'))"
17750179
python -c "import glob; print len(glob.glob('*'))"  8,20s user 12,37s system 1% cpu 32:00,29 total

Los números que se informe difieren porque yo era de copiar los archivos de la gran directorio al mismo tiempo (y porque el comando buscar también las listas de los archivos de los subdirectorios que se puede corregir mediante el uso de -maxdepth=1) y no a inicio todos los programas al mismo tiempo. Sin embargo, una tendencia general es claramente visible. La primera es la de la C variante encontrada en este hilo vinculado por CodeIt.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: