bash - home - Comando Quick ls
ls unix (18)
Tengo que obtener una lista de directorio que contiene alrededor de 2 millones de archivos, pero cuando hago un comando ls
, nada vuelve. He esperado 3 horas. Lo he intentado ls | tee directory.txt
ls | tee directory.txt
, pero parece colgarse para siempre.
Supongo que el servidor está haciendo una gran cantidad de inodos de clasificación. ¿Hay alguna manera de acelerar el comando ls
para obtener una lista de directorios de nombres de archivos? No me importa el tamaño, las fechas, el permiso o similares en este momento.
¿Asumo que estás usando GNU ls? tratar
/ls
Desaparece la ls habitual (ls --color = auto).
Cosas para intentar:
¿Comprobar ls no tiene alias?
alias ls
Tal vez intente encontrar en su lugar?
find . /( -type d -name . -prune /) -o /( -type f -print /)
Espero que esto ayude.
Si un proceso "no vuelve", recomiendo analizar cómo un proceso está interactuando con el sistema operativo.
En caso de ls:
$strace ls
habrías visto que lee todas las entradas de directorio ( getdents (2) ) antes de que realmente arroje algo. (ordenando ... como ya se mencionó aquí)
ls -U
hará el ls sin clasificar.
Muchas otras soluciones buenas aquí, pero en aras de la integridad:
echo *
También puede hacer uso de xargs . Simplemente canalice la salida de ls a través de xargs .
ls | xargs
Si eso no funciona y los ejemplos de búsqueda anteriores no funcionan, intente conectarlos a xargs ya que puede ayudar al uso de la memoria que podría estar causando sus problemas.
Algunos seguimiento: no mencionas en qué sistema operativo estás ejecutando, lo que ayudaría a indicar qué versión de ls estás usando. Esto probablemente no es una pregunta ''bash'' tanto como una pregunta ls. Supongo que estás usando GNU ls, que tiene algunas características que son útiles en algunos contextos, pero te matan en grandes directorios.
GNU ls Tratando de tener arreglos de columnas más bonitos. GNU ls intenta hacer un arreglo inteligente de todos los nombres de archivo. En un gran directorio, esto llevará tiempo y memoria.
Para ''arreglar'' esto, puedes intentar:
ls -1
# sin columnas en absoluto
encuentre BSD ls en algún lugar, http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/ls/ y use eso en sus grandes directorios.
Use otras herramientas, como encontrar
Probablemente esta no sea una respuesta útil, pero si no la find
, puede que se las tar
con 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.
Esta sería la opción más rápida AFAIK: ls -1 -f
.
-
-1
(sin columnas) -
-f
(Sin clasificación)
¿Qué le find ./ -type f
(que encontrará todos los archivos en el directorio actual)? Quítate el -type f
para encontrar todo.
¿Qué tipo de partición estás usando?
Tener millones de archivos pequeños en un directorio podría ser una buena idea usar JFS o ReiserFS que tengan un mejor rendimiento con muchos archivos de pequeño tamaño.
Hay varias formas de obtener una lista de archivos:
Use este comando para obtener una lista sin ordenar:
ls -U
o envíe la lista de archivos a un archivo usando:
ls /Folder/path > ~/Desktop/List.txt
Intenta usar:
find . -type f -maxdepth 1
Esto solo mostrará una lista de los archivos en el directorio, -type f
argumento -type f
si desea listar los archivos y directorios.
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 ejecutar man ls
para verificar.
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;
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
-
ls -f
corrió un poco más rápido quels -U
. Deshabilitar el color podría haber causado esta mejora. -
find
comandofind
corrió en tercer lugar con una velocidad promedio de 2.738 segundos. - Correr solo
ls
tomó 42.16 segundos. Aquí en mi sistemals
es un alias parals --color=auto
- El uso de la función de expansión de shell con
echo ./*
funcionó durante 50.80 segundos. - Y la solución basada en
tar
tiene alrededor de 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 el terminal sino que se redirigen a un archivo y el conteo de archivos se calculó más tarde con el comando wc
. Los comandos corrían demasiado lento si las salidas estaban impresas en la pantalla.
¿Alguna idea de por qué sucede esto?
Tengo un directorio con 4 millones de archivos y la única manera en que obtuve ls para escupir archivos inmediatamente sin mucha agitación primero fue
ls -1U