¿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.
command-line
ls
limit
AndreDurao
fuente
fuente

ls -Uno necesariamente lee todo el directorio antes de imprimir. Pruebestrace -e getdents,write ls -U > /dev/nullen un directorio grande, por ejemplo.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.(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).fuente
find(a diferencia de busybox o heirloomfindo GNUls -U), parece que lee todo el directorio antes de comenzar a imprimir.¿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
lsefindintenta leer todas las entradas del directorio antes de imprimir, mientras que laperlsolución que propone no lo hace.fuente
perlprobablemente usareaddir(3)likelsofind.readdir(3)en las versiones actuales de GNU / Linux, al menos llama a la llamada delgetdents()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 omitirreaddiry utilizar BSDgetdirentries(3)o lagetdents(2)llamada del sistema en su lugar.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, conzsh, puede usar: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 quelstambién clasifica esa lista).fuente
¿Quizás menos se adapta mejor a tus necesidades?
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,
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?
fuente
lsresultado. Estaba buscando una forma de ls para limitar la cantidad de resultados.fuente
lscomando en bash. Hilo comandos comogrep,head,tailu otras personas se ejecuta después de lalshará la tarea de buscar los primeros
narchivos.nes la cantidad de archivos que desea extraer. así que el código completo será:fuente
ls | cut -f 1,n filecomando que sugirió generaría el primer y el enésimo campo en cada línea de textofile, e ignoraría por completo el resultado dels. Esto no hace lo que necesita el póster original.