¿Cuál es el punto de ls -f (o, ¿por qué está colgando?)

9

Tengo un directorio con aproximadamente 100,000 archivos en él. ls -f se cuelga por más de un minuto. Corrí strace e inmediatamente comencé a ver getdents, por lo que ls claramente está leyendo el directorio. También veo muchas llamadas a brk, por lo que ls claramente está guardando cosas en la memoria intermedia. Escribí un programa simple que llama a readdir y genera nombres de archivos, y responde de inmediato. Pero ls -f no proporciona salida. ¿Lo que da? Pensé que el punto de -f es que hace que ls no haga nada más que readdir. ¿Existe una forma portátil y confiable de enumerar el contenido de un directorio? (Tenga en cuenta que esto es ls de coreutils de gnu en Linux).

-EDITAR-

Había un alias en su lugar, pero "/ bin / ls -1f> / dev / null" toma de 8 a 15 segundos, "/ bin / ls -1fx> / dev / null" toma de 4 a 11 segundos, pero un programa simple eso solo readdir toma 0.011 segundos. ¿Qué necesito hacer para que gnu ls no sea una mierda?

William Pursell
fuente

Respuestas:

7

El objetivo -fes tratar de evitar la necesidad de crear estadísticas en cada entrada de archivo y evitar la necesidad de leerlas todas antes de que se muestren. Es una opción "meta" que simplemente desactiva otras opciones.

Entonces, sí, debería hacer lo que esperas. No puedo responder por qué no lo es, pero supongo que puede tener un alias de shell o algo más que inserte opciones adicionales al comando. Eso podría volver a habilitar una característica que -fdeshabilita, y ser considerado "más específico", así que tenga prioridad.

Daniel Pittman
fuente
2
Argghh ls () {/ bin / ls -FB $ @; } Estúpidos scripts de inicio.
William Pursell
1
hmm Desarmado la función y aún veo el mismo comportamiento incluso cuando ejecuto / bin / ls.
William Pursell
Do / bin / ls -f -1 (eso es menos uno, no menos-ell). El / bin / ls en un cuadro RHEL estoy usando formatos de nombres de archivo en columnas por alguna razón.
Bruce Ediger
0

Se agregó una optimización en coreutils 7.0 (commit 8d974b00fbbc2025de63e1e6d54827648fefa1c4):

2008-08-01  Kamil Dudka  <[email protected]>
    ls -U1 now uses constant memory
    When printing one name per line and not sorting, ls now uses
    constant memory per directory, no matter how many files are in
    the directory.
    * ls.c (print_dir): Print each file name immediately, when possible.
    * NEWS: Mention the improvement.

La primera explicación que viene a la mente es que está ejecutando una versión anterior de coreutils. Necesitas actualizar.

Gilles 'SO- deja de ser malvado'
fuente