Pregunta Comando Quick ls


Tengo que obtener una lista de directorio que contiene alrededor de 2 millones de archivos, pero cuando hago un ls comando en él, nada vuelve. He esperado 3 horas. He intentado ls | tee directory.txt, pero eso parece colgar para siempre.

Supongo que el servidor está haciendo una gran cantidad de inodos de clasificación. ¿Hay alguna manera de acelerar el ls comando para obtener una lista de directorio de nombres de archivo? No me importa el tamaño, las fechas, el permiso o similares en este momento.


32
2017-09-02 18:19


origen


Respuestas:


ls -U

hará el ls sin clasificar.


34
2017-09-02 18:25



Intenta usar:

find . -type f -maxdepth 1

Esto solo mostrará los archivos en el directorio, omita el -type f argumento si quiere listar archivos y directorios.


11
2017-09-02 18:23



Esta pregunta parece ser interesante y estaba pasando por múltiples respuestas que se publicaron. Para comprender la eficacia de las respuestas publicadas, las ejecuté en 2 millones de archivos y encontré los resultados como a continuación.

$ time tar cvf /dev/null . &> /tmp/file-count

real    37m16.553s
user    0m11.525s
sys     0m41.291s

------------------------------------------------------

$ time echo ./* &> /tmp/file-count

real    0m50.808s
user    0m49.291s
sys     0m1.404s

------------------------------------------------------

$ time ls &> /tmp/file-count

real    0m42.167s
user    0m40.323s
sys     0m1.648s

------------------------------------------------------

$ time find . &> /tmp/file-count

real    0m2.738s
user    0m1.044s
sys     0m1.684s

------------------------------------------------------

$ time ls -U &> /tmp/file-count

real    0m2.494s
user    0m0.848s
sys     0m1.452s


------------------------------------------------------

$ time ls -f &> /tmp/file-count

real    0m2.313s
user    0m0.856s
sys     0m1.448s

------------------------------------------------------

Para resumir los resultados

  1. ls -f comando corrió un poco más rápido que ls -U. Deshabilitar el color podría haber causado esta mejora.
  2. find comando corrió tercero con una velocidad promedio de 2.738 segundos.
  3. Corriendo solo ls tomó 42.16 segundos. Aquí en mi sistema ls es un alias para ls --color=auto
  4. Usar la función de expansión de shell con echo ./* funcionó por 50.80 segundos.
  5. Y el tar la solución basada tomó aproximadamente 37 miuntes.

Todas las pruebas se realizaron por separado cuando el sistema estaba inactivo.

Una cosa importante a tener en cuenta aquí es que las listas de archivos no se imprimen en la terminal en lugar de fueron redirigidos a un archivo y el conteo de archivos se calculó más tarde con wc mando. Los comandos corrían demasiado lento si las salidas estaban impresas en la pantalla.

¿Alguna idea de por qué sucede esto?


5
2017-11-02 13:38



Probablemente esta no sea una respuesta útil, pero si no tiene find es posible que puedas arreglártelas tar

$ tar cvf /dev/null .

Algunas personas mayores me dicen que, "en el pasado", los entornos de recuperación y usuario único eran mucho más limitados de lo que son hoy en día. De ahí viene este truco.


4
2017-09-01 16:03



Utilizando

ls -1 -f 

es aproximadamente 10 veces más rápido y es fácil de hacer (probé con 1 millón de archivos, pero mi problema original tenía 6 800 000 000 de archivos)

Pero en mi caso, necesitaba verificar si algún directorio específico contiene más de 10 000 archivos. Si hay más de 10 000 archivos, ya no me interesa cuántos archivos hay. Acabo de salir del programa para que funcione más rápido y no intente leer el resto uno a uno. Si hay menos de 10 000, imprimiré la cantidad exacta. La velocidad de mi programa es bastante similar a ls -1 -f si especifica un valor mayor para el parámetro que la cantidad de archivos.

Puede usar mi programa find_if_more.pl en el directorio actual escribiendo:

find_if_more.pl 999999999

Si solo le interesa si hay más de n archivos, el script finalizará más rápido que ls -1 -f con una gran cantidad de archivos.

#!/usr/bin/perl
    use warnings;
    my ($maxcount) = @ARGV;
    my $dir = '.';
    $filecount = 0;
    if (not defined $maxcount) {
      die "Need maxcount\n";
    }
    opendir(DIR, $dir) or die $!;
    while (my $file = readdir(DIR)) {
        $filecount = $filecount + 1;
        last if $filecount> $maxcount
    }
    print $filecount;
    closedir(DIR);
    exit 0;

4
2017-11-01 16:09



Esta sería la opción más rápida AFAIK: ls -1 -f.

  • -1 (Sin columnas)
  • -f (Sin clasificación)

3
2017-08-27 11:31



Puede redirigir la salida y ejecutar el proceso ls en segundo plano.

ls > myls.txt &

Esto le permitiría continuar con su negocio mientras se está ejecutando. No bloquearía tu caparazón.

No estoy seguro de qué opciones hay para ejecutar ls y recuperar menos datos. Siempre puedes correr man ls verificar.


3
2017-09-02 18:23