Come posso limitare il numero di file stampati da ls?


89

C'è un modo per limitare la quantità di file elencati su un lscomando?

Ho visto:

ls | head -4

ma per ottenere heado tailper essere eseguito devo aspettare lsche finisca l'esecuzione, e con le directory con un'enorme quantità di file che può richiedere molto tempo.

Vorrei eseguire un lscomando che limiti senza usare quel headcomando.

Risposte:


109

Hai provato

ls -U | head -4

Questo dovrebbe saltare l'ordinamento, che è probabilmente il motivo per cui lssta impiegando così tanto tempo.

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


"ls -U" legge ancora l'intera directory prima di stampare ... Penso che scriverò un piccolo script per limitare i file, ma quel link alla domanda è un buon materiale di lettura. Grazie niko.
AndreDurao,

5
@AndreDurao, GNU ls -Unon legge necessariamente l'intera directory prima della stampa. Prova strace -e getdents,write ls -U > /dev/nullad esempio in una directory di grandi dimensioni.
Stéphane Chazelas,

Solo una nota: se vuoi eseguire strace su OSX cerca dtrace, il comando strace è un'utility Linux
AndreDurao,

12

Se la tua versione di lsha un modo per non ordinare i file, come -Uper GNU ls , usalo . Senza alcuna opzione, lsprima leggerà tutti i file, quindi ordinerà i nomi, quindi inizierà a stampare.

Un'altra possibilità è quella di eseguire find, che stampa i nomi come li trova.

find . -name . -o -prune | head

(nota che poiché headsta lavorando su linee , presuppone che i nomi dei file non contengano caratteri di nuova riga).


1
Si noti che nel caso di GNU find(al contrario di busybox o heirloom findo GNU ls -U), sembra che legga l'intera directory prima di iniziare a stampare.
Stéphane Chazelas,

4

Forse hai bisogno di uno strumento diverso da ls?

Ad esempio, Randal Schwartz ha un post sul blog sull'uso perlin grandi directory che può contenere alcuni suggerimenti su come costruire qualcosa che soddisfi le tue esigenze.

Nel blog distacco Randal spiega che sia lse findtentativo di leggere in tutte le voci di directory prima di stampare qualsiasi, mentre la perlsoluzione che si propone non lo fa.


Ho anche pensato che potesse essere l'opzione migliore, perché sia ​​ls che find leggono l'intera directory prima di stampare. Avevo intenzione di scrivere una sceneggiatura ruby ​​per farlo invece di pearl, grazie per questo AFresh1!
AndreDurao,

1
@AndreDurao, perlprobabilmente usa readdir(3)like lso find. readdir(3)sulle attuali versioni di GNU / Linux almeno chiama la chiamata di getdents()sistema con un grande conteggio (che in realtà generalmente ottimizza le prestazioni riducendo il numero di chiamate di sistema effettuate). Ma nel tuo caso, se vuoi un numero inferiore di file, sembra che dovresti bypassare readdire utilizzare BSD getdirentries(3)o la getdents(2)chiamata di sistema.
Stéphane Chazelas,

3

Se la prestazione non è la preoccupazione (come nella domanda che è stata chiusa come duplicata di questa), e si desidera elencare i primi n file (al contrario delle prime n righe dell'output di ls) nell'elenco di non- file nascosti ordinati per nome file, con zsh, è possibile utilizzare:

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

per elencare i primi 4 file. zshleggerà comunque l'intero contenuto della directory, anche se gli dici di non ordinare con *(oN[1,4])(nota che ordina ls anche quell'elenco).


1

Forse meno è più adatto alle tue esigenze?

 ls /usr/bin | less

Per me, funziona istantaneamente su un laptop di 5 anni con un classico HDD, ma la testa è altrettanto veloce.

Puoi terminare lessprematuramente con q.

Immagino che la tua ipotesi sulla fonte del ritardo 1s sia errata, ma forse dipende dal tuo sapore Unix o dalla tua shell, meno o comando head.

Su Linux, con GNU-ls,

 ls -R /usr | less 

inizia a produrre immediatamente per me, mentre l'intero output è in esecuzione e in esecuzione - quindi non è definitivamente terminato, prima che inizi meno. È possibile verificare, se si ha un ritardo costante di 1s o forse più, a seconda dell'uscita o meno.

Immagino che il tuo ritardo di 1s abbia una ragione diversa, forse l'HDD sta per dormire e ha bisogno di un risveglio?

Hai un tale ritardo anche per pochissimi file?


Grazie ma non stavo cercando qualcosa del genere. Proprio come la testa, il meno viene eseguito con il risultato dell'intero lsrisultato. Stavo cercando un modo per limitare se stesso i risultati.
AndreDurao,

@AndreDurao: ho spostato i miei commenti nella risposta.
utente sconosciuto

0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail

Mi dispiace Abhishek, ma il punto di questa domanda è avvalersi del lscomando su bash. Piped comandi come grep, head, tailo altro vengono eseguite dopo lals
AndreDurao

0
$ cut -f 1,n filename

farà il compito di recuperare i primi nfile. nè il numero di file che si desidera estrarre. quindi il codice completo sarà:

$ ls|cut -f 1,n file

1
Il ls | cut -f 1,n filecomando che hai suggerito avrebbe generato il primo e l'ennesimo campo su ciascuna riga di testo filee ignorerebbe completamente l'output di ls. Questo non fa ciò di cui ha bisogno il poster originale.
telcoM

Sì, hai ragione. Solo una correzione rendila ls | head -n ... Questo sicuramente farà il compito.
Ramandeep Singh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.