¿Cómo limito el número de archivos impresos por ls?

89

¿Hay alguna forma de limitar la cantidad de archivos listados en un lscomando?

He visto:

ls | head -4

pero para obtener heado tailser ejecutado necesito esperar a lsque termine la ejecución, y con directorios con una enorme cantidad de archivos que pueden llevar un tiempo considerable.

Deseo ejecutar un lscomando que limite sin usar ese headcomando.

AndreDurao
fuente

Respuestas:

109

Has probado

ls -U | head -4

Esto debería omitir la clasificación, lo que probablemente sea la razón por la lsque tarda tanto.

https://stackoverflow.com/questions/40193/quick-ls-command

niko
fuente
"ls -U" todavía lee todo el directorio antes de imprimir ... Creo que escribiré un pequeño script para limitar los archivos, pero ese enlace de preguntas es un buen material de lectura. Gracias niko
AndreDurao
55
@AndreDurao, GNU ls -Uno necesariamente lee todo el directorio antes de imprimir. Pruebe strace -e getdents,write ls -U > /dev/nullen un directorio grande, por ejemplo.
Stéphane Chazelas
Solo una nota: si desea ejecutar strace en OSX busque dtrace, el comando strace es una utilidad de Linux
AndreDurao
12

Si su versión de lstiene una manera de no ordenar archivos, como -Upara GNU ls , úselo . Sin ninguna opción, lsprimero leerá todos los archivos, luego ordenará los nombres y luego comenzará a imprimir.

Otra posibilidad es ejecutar find, que imprime los nombres a medida que los encuentra.

find . -name . -o -prune | head

(tenga en cuenta que, dado que headestá trabajando en líneas , se supone que los nombres de archivo no contienen caracteres de nueva línea).

Gilles
fuente
1
Tenga en cuenta que en el caso de GNU find(a diferencia de busybox o heirloom findo GNU ls -U), parece que lee todo el directorio antes de comenzar a imprimir.
Stéphane Chazelas
4

¿Quizás necesita otra herramienta que no sea ls?

Por ejemplo, Randal Schwartz tiene una entrada de blog sobre el uso perlen directorios grandes que puede contener algunos consejos sobre cómo construir algo que satisfaga sus necesidades.

En la publicación del blog, Randal explica eso lse findintenta leer todas las entradas del directorio antes de imprimir, mientras que la perlsolución que propone no lo hace.

AFresh1
fuente
También pensé que podría ser la mejor opción, porque tanto ls como find leen todo el directorio antes de imprimir. Estaba planeando escribir un script de ruby ​​para hacer eso en lugar de pearl, ¡gracias por eso AFresh1!
AndreDurao
1
@AndreDurao, perlprobablemente usa readdir(3)like lso find. readdir(3)en las versiones actuales de GNU / Linux, al menos llama a la llamada del getdents()sistema con un gran recuento (que en realidad optimiza el rendimiento al reducir la cantidad de llamadas al sistema que se realizan). Pero en su caso, si desea menos archivos, parece que tendría que omitir readdiry utilizar BSD getdirentries(3)o la getdents(2)llamada del sistema en su lugar.
Stéphane Chazelas
3

Si el rendimiento no es la preocupación (como en la pregunta que se cerró como un duplicado de este), y desea enumerar los primeros n archivos (en oposición a las primeras n líneas de la salida de ls) en la lista de archivos ocultos ordenados por nombre de archivo, con zsh, puede usar:

ls -ld -- *([1,4])

para enumerar los primeros 4 archivos. zshsin embargo, seguirá leyendo el contenido completo del directorio, incluso si le dice que no ordene *(oN[1,4])(tenga en cuenta que ls también clasifica esa lista).

Stéphane Chazelas
fuente
1

¿Quizás menos se adapta mejor a tus necesidades?

 ls /usr/bin | less

Para mí, funciona instantáneamente en una computadora portátil de 5 años con HDD clásico, pero la cabeza es igual de rápida.

Puede terminar lessprematuramente con q.

Supongo que su suposición sobre la fuente del retraso de 1 es incorrecta, pero tal vez depende de su sabor de Unix o de su shell, menos o comando principal.

En Linux, con GNU-ls,

 ls -R /usr | less 

comienza a emitirse inmediatamente para mí, mientras toda la salida se está ejecutando y ejecutando, por lo que definitivamente no está terminada, antes de que comience menos. Puede verificar, si tiene un retraso constante de 1s o tal vez más, dependiendo de la salida o no.

Supongo que el retraso de 1 tiene una razón diferente, ¿tal vez el HDD va a dormir y necesita un despertador?

¿También tiene un retraso para muy pocos archivos?

usuario desconocido
fuente
Gracias pero no estaba buscando algo así. Al igual que head, menos se ejecuta con el resultado de todo el lsresultado. Estaba buscando una forma de ls para limitar la cantidad de resultados.
AndreDurao
@AndreDurao: Moví mis comentarios a la respuesta.
usuario desconocido el
0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail
Abhishek
fuente
Lo siento Abhishek, pero el objetivo de esta pregunta es hacer uso del lscomando en bash. Hilo comandos como grep, head, tailu otras personas se ejecuta después de lals
AndreDurao
0
$ cut -f 1,n filename

hará la tarea de buscar los primeros narchivos. nes la cantidad de archivos que desea extraer. así que el código completo será:

$ ls|cut -f 1,n file
Ramandeep Singh
fuente
1
El ls | cut -f 1,n filecomando que sugirió generaría el primer y el enésimo campo en cada línea de texto file, e ignoraría por completo el resultado de ls. Esto no hace lo que necesita el póster original.
telcoM
Sí, tienes razón. Solo una corrección haz que sea ls | head -n ... Esto seguramente hará la tarea.
Ramandeep Singh