¿Hay alguna forma de limitar la cantidad de archivos listados en un ls
comando?
He visto:
ls | head -4
pero para obtener head
o tail
ser ejecutado necesito esperar a ls
que termine la ejecución, y con directorios con una enorme cantidad de archivos que pueden llevar un tiempo considerable.
Deseo ejecutar un ls
comando que limite sin usar ese head
comando.
command-line
ls
limit
AndreDurao
fuente
fuente
ls -U
no necesariamente lee todo el directorio antes de imprimir. Pruebestrace -e getdents,write ls -U > /dev/null
en un directorio grande, por ejemplo.Si su versión de
ls
tiene una manera de no ordenar archivos, como-U
para GNU ls , úselo . Sin ninguna opción,ls
primero 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
head
está 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 heirloomfind
o 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
perl
en 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
ls
efind
intenta leer todas las entradas del directorio antes de imprimir, mientras que laperl
solución que propone no lo hace.fuente
perl
probablemente usareaddir(3)
likels
ofind
.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 omitirreaddir
y 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.
zsh
sin embargo, seguirá leyendo el contenido completo del directorio, incluso si le dice que no ordene*(oN[1,4])
(tenga en cuenta quels
tambié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
less
prematuramente 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
ls
resultado. Estaba buscando una forma de ls para limitar la cantidad de resultados.fuente
ls
comando en bash. Hilo comandos comogrep
,head
,tail
u otras personas se ejecuta después de lals
hará la tarea de buscar los primeros
n
archivos.n
es la cantidad de archivos que desea extraer. así que el código completo será:fuente
ls | cut -f 1,n file
comando 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.