Czy istnieje sposób na ograniczenie liczby plików na liście w ls
poleceniu?
Widziałem:
ls | head -4
ale aby uzyskać head
lub tail
wykonać, muszę poczekać na ls
zakończenie wykonywania oraz z katalogami z ogromną ilością plików, które mogą zająć dużo czasu.
Chcę wykonać ls
polecenie, które ogranicza bez użycia tego head
polecenia.
command-line
ls
limit
AndreDurao
źródło
źródło
ls -U
niekoniecznie czyta cały katalog przed wydrukowaniem. Spróbujstrace -e getdents,write ls -U > /dev/null
na przykład w dużym katalogu.Jeśli twoja wersja
ls
nie pozwala na sortowanie plików, na przykład-U
GNU , użyj go. Bez opcjils
najpierw 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.(zauważ, że ponieważ
head
działa na liniach , zakładając, że nazwy plików nie zawierają znaków nowej linii).źródło
find
(w przeciwieństwie do busybox, heirloomfind
lub GNUls -U
) wydaje się, że czyta cały katalog przed rozpoczęciem drukowania.Być może potrzebujesz innego narzędzia niż
ls
?Na przykład Randal Schwartz ma wpis na blogu o korzystaniu
perl
z 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
ls
ifind
próbuje przeczytać wszystkie wpisy w katalogu przed wydrukowaniem jakiegokolwiek, podczas gdyperl
proponowane przez niego rozwiązanie tego nie robi.źródło
perl
prawdopodobnie używareaddir(3)
jakls
lubfind
.readdir(3)
w obecnych wersjach GNU / Linux przynajmniej wywołuje wywołaniegetdents()
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ąćreaddir
i użyć BSDgetdirentries(3)
lubgetdents(2)
wywołania systemowego.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ć:aby wyświetlić pierwsze 4 pliki.
zsh
nadal będzie czytać pełną zawartość katalogu, nawet jeśli powiesz mu, aby nie sortować według*(oN[1,4])
(pamiętaj, że sortujels
również tę listę).źródło
Może mniej jest lepiej dostosowane do twoich potrzeb?
Dla mnie działa natychmiast na 5-letnim laptopie z klasycznym dyskiem twardym, ale głowa jest równie szybka.
Możesz zakończyć
less
przedwcześ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
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?
źródło
ls
wyniku. Szukałem sposobu, aby samemu ls ograniczyć liczbę wyników.źródło
ls
polecenia bash. Piped poleceń takich jakgrep
,head
,tail
czy inni są wykonywane pols
wykona zadanie pobrania pierwszych
n
plików.n
to liczba plików, które chcesz wyodrębnić. więc pełny kod będzie:źródło
ls | cut -f 1,n file
Komenda zasugerował by wyjście pierwszego i n-tego pola w każdej linii tekstu wfile
, i całkowicie ignorować wyjściels
. Nie robi to, czego potrzebuje oryginalny plakat.