Jak ograniczyć liczbę plików drukowanych przez ls?

89

Czy istnieje sposób na ograniczenie liczby plików na liście w lspoleceniu?

Widziałem:

ls | head -4

ale aby uzyskać headlub tailwykonać, muszę poczekać na lszakończenie wykonywania oraz z katalogami z ogromną ilością plików, które mogą zająć dużo czasu.

Chcę wykonać lspolecenie, które ogranicza bez użycia tego headpolecenia.

AndreDurao
źródło

Odpowiedzi:

109

Czy próbowałeś

ls -U | head -4

Powinno to pominąć sortowanie, i prawdopodobnie dlatego lstrwa to tak długo.

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

niko
źródło
„ls -U” nadal czyta cały katalog przed wydrukowaniem ... Myślę, że napiszę mały skrypt, aby ograniczyć pliki, ale ten link do pytania jest dobrym materiałem do czytania. Dzięki niko.
AndreDurao,
5
@AndreDurao, GNU ls -Uniekoniecznie czyta cały katalog przed wydrukowaniem. Spróbuj strace -e getdents,write ls -U > /dev/nullna przykład w dużym katalogu.
Stéphane Chazelas
Tylko uwaga: jeśli chcesz uruchomić strace w OSX, poszukaj dtrace, komenda strace to narzędzie Linuksa
AndreDurao
12

Jeśli twoja wersja lsnie pozwala na sortowanie plików, na przykład -UGNU , użyj go. Bez opcji lsnajpierw przeczyta wszystkie pliki, a następnie posortuje nazwy, a następnie rozpocznie drukowanie.

Inną możliwością jest uruchomienie find, które wypisuje nazwy, gdy je znajdzie.

find . -name . -o -prune | head

(zauważ, że ponieważ headdziała na liniach , zakładając, że nazwy plików nie zawierają znaków nowej linii).

Gilles
źródło
1
Zauważ, że w przypadku GNU find(w przeciwieństwie do busybox, heirloom findlub GNU ls -U) wydaje się, że czyta cały katalog przed rozpoczęciem drukowania.
Stéphane Chazelas
4

Być może potrzebujesz innego narzędzia niż ls?

Na przykład Randal Schwartz ma wpis na blogu o korzystaniu perlz dużych katalogów, który może zawierać wskazówki dotyczące tworzenia czegoś, co spełnia Twoje potrzeby.

W blogu Randal wyjaśnia, że ​​zarówno lsi findpróbuje przeczytać wszystkie wpisy w katalogu przed wydrukowaniem jakiegokolwiek, podczas gdy perlproponowane przez niego rozwiązanie tego nie robi.

AFresh1
źródło
Pomyślałem również, że może to być najlepsza opcja, ponieważ zarówno ls, jak i find czytają cały katalog przed drukowaniem. Chciałem napisać skrypt ruby, aby to zrobić zamiast perły, dzięki za ten AFresh1!
AndreDurao
1
@AndreDurao, perlprawdopodobnie używa readdir(3)jak lslub find. readdir(3)w obecnych wersjach GNU / Linux przynajmniej wywołuje wywołanie getdents()systemowe z dużą liczbą (co w rzeczywistości optymalizuje wydajność poprzez zmniejszenie liczby wykonywanych wywołań systemowych). Ale w twoim przypadku, jeśli chcesz mniej plików, wygląda na to, że będziesz musiał ominąć readdiri użyć BSD getdirentries(3)lub getdents(2)wywołania systemowego.
Stéphane Chazelas
3

Jeśli wydajność nie jest problemem (jak w pytaniu, które zostało zamknięte jako duplikat tego), a chcesz wymienić pierwsze n plików (w przeciwieństwie do pierwszych n wierszy danych wyjściowych ls) na liście innych niż ukryte pliki posortowane według nazwy pliku, za pomocą zsh, możesz użyć:

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

aby wyświetlić pierwsze 4 pliki. zshnadal będzie czytać pełną zawartość katalogu, nawet jeśli powiesz mu, aby nie sortować według *(oN[1,4])(pamiętaj, że sortuje ls również tę listę).

Stéphane Chazelas
źródło
1

Może mniej jest lepiej dostosowane do twoich potrzeb?

 ls /usr/bin | less

Dla mnie działa natychmiast na 5-letnim laptopie z klasycznym dyskiem twardym, ale głowa jest równie szybka.

Możesz zakończyć lessprzedwcześnie za pomocą q.

Wydaje mi się, że twoje przypuszczenie o źródle opóźnienia 1s jest błędne, ale może zależy od Twojego uniksowego smaku lub powłoki, mniejszej ilości poleceń lub polecenia.

W systemie Linux z GNU-ls

 ls -R /usr | less 

zaczyna dla mnie natychmiastowe wyjście, podczas gdy całe wyjście jest uruchomione i uruchomione - więc ostatecznie nie jest ukończone, zanim zacznie się mniej. Możesz sprawdzić, czy masz stałe opóźnienie 1 s, a może więcej, w zależności od wyjścia, czy nie.

Wydaje mi się, że opóźnienie 1s ma inny powód. Być może dysk twardy idzie spać i potrzebuje się obudzić?

Czy masz takie opóźnienie także w przypadku bardzo niewielu plików?

nieznany użytkownik
źródło
Dzięki, ale nie szukałem czegoś takiego. Podobnie jak głowa, mniej jest wykonywane z wynikiem całego lswyniku. Szukałem sposobu, aby samemu ls ograniczyć liczbę wyników.
AndreDurao
@AndreDurao: Przeniesiłem moje komentarze do odpowiedzi.
użytkownik nieznany
0
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail
Abhishek
źródło
Przykro mi, Abhishek, ale chodzi o to, aby skorzystać z lspolecenia bash. Piped poleceń takich jak grep, head, tailczy inni są wykonywane pols
AndreDurao
0
$ cut -f 1,n filename

wykona zadanie pobrania pierwszych nplików. nto liczba plików, które chcesz wyodrębnić. więc pełny kod będzie:

$ ls|cut -f 1,n file
Ramandeep Singh
źródło
1
ls | cut -f 1,n fileKomenda zasugerował by wyjście pierwszego i n-tego pola w każdej linii tekstu w file, i całkowicie ignorować wyjście ls. Nie robi to, czego potrzebuje oryginalny plakat.
telcoM
Tak masz rację. Tylko poprawka sprawi, że będzie ls head -n ... To na pewno spełni zadanie.
Ramandeep Singh,