recursive home all bash unix command ls

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

  1. ls -f corrió un poco más rápido que ls -U . Deshabilitar el color podría haber causado esta mejora.
  2. find comando find corrió en tercer lugar con una velocidad promedio de 2.738 segundos.
  3. Correr solo ls tomó 42.16 segundos. Aquí en mi sistema ls es un alias para ls --color=auto
  4. El uso de la función de expansión de shell con echo ./* funcionó durante 50.80 segundos.
  5. 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


Debe proporcionar información sobre el sistema operativo y el tipo de sistema de archivos que está utilizando. En ciertos sabores de UNIX y ciertos sistemas de archivos, es posible que pueda usar los comandos ff y ncheck como alternativas.