Odpowiedzi:
Powinieneś użyć następującego polecenia:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: wyszukaj pliki na wybranej ścieżce. Jeśli nie chcesz, aby był rekurencyjny, a twoja find
implementacja go obsługuje, powinieneś dodać -maxdepth 1
tuż przed -exec
opcją.exec
: nakazuje wykonanie polecenia dla wc -l
każdego pliku.sort -rn
: sortuj wyniki numerycznie w odwrotnej kolejności. Od większego do niższego.(przy założeniu, że nazwy plików nie zawierają znaków nowej linii).
wc
również wydrukuje total
wiersz, więc tutaj otrzymasz również jeden lub więcej „łącznych” wierszy, chyba że jest tylko jeden plik . Możesz potokować, aby grep /
je usunąć.
sort
komendą
Prawdopodobnie najprostsza wersja, jeśli nie potrzebujesz rekurencyjności:
wc -l /group/book/four/word/*|sort -n
wc
zlicza linie (opcja -l
) w każdym (ale ukrytym) ( *
) pliku poniżej /group/book/four/word/
i sort
sortuje wynik (przez potok |
) numerycznie (opcja -n
).
Ktoś skomentował tę odpowiedź, wspominając o niej grep -rlc
, zanim ją stłumi. Rzeczywiście grep
jest świetną alternatywą, szczególnie jeśli potrzebujesz rekurencyjności:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
policzy (opcja -c
) rekurencyjnie (opcja -r
) wiersze pasujące ( grep
) '^'
(czyli początek linii) w katalogu /group/book/four/word/
. Następnie musisz zastąpić dwukropek spacją, np. Używając tr
, aby pomóc sort
, którą chcesz posortować numerycznie (opcja -n
) w drugiej kolumnie (opcja -k2
).
Aktualizacja: Zobacz komentarz Stephane'a na temat możliwych ograniczeń i tego, jak możesz się go pozbyć tr
.
grep -c .
zlicza wiersze zawierające co najmniej jeden poprawny znak. Służy grep -c '^'
do zliczania wszystkich linii (w przypadku niektórych grep
implementacji policzy także końcowe znaki po ostatniej nowej linii ). Należy pamiętać, że nie wszystkie grep
implementacje obsługują a, -r
a zachowanie różni się między tymi, które to robią. Nie musisz tłumaczyć :
s (dwukropka, nie średnika) na spacje dla sort
. Po prostu użyj -t:
. Zauważ, że przy założeniu, że nazwy plików nie zawierają :
ani znaków pustych ani nowego wiersza.
wc
podałem tak poręczną sumę, jeśli przejdziesz wiele ścieżek. Połączenie tej funkcjonalności z dziką kartą i potokiem sort
jest naprawdę czyste.
Z zsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
Definiujemy nową funkcję sortowania,lines
która odpowiada liczbą wierszy w pliku. I używamy o+lines
kwalifikatora glob, który wraz z n
(do sortowania numerycznego) określa, w jaki sposób uporządkowane są wyniki globu. ( .
dodany również w celu sprawdzenia zwykłych plików).
Nie zakłada to, jaki znak nazwy plików mogą zawierać inne niż pliki ukryte (te zaczynające się od .
) są pomijane. Dodaj D
kwalifikator glob, jeśli chcesz.
bash
tylko ...
Nie określasz, czy chcesz również pliki w podkatalogach /group/book/four/word
. find
Rozwiązanie w odpowiedzi jherran będzie zejść do podkatalogów. Jeśli nie jest to potrzebne, zamiast tego użyj powłoki:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Jeśli twoje nazwy plików mogą zawierać znaki nowej linii, możesz użyć czegoś takiego:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
Wreszcie, jeśli zrobić chcą zejść do podkatalogów, można to wykorzystać w bash
4 lub powyżej:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Zauważ, że wersje bash
wcześniejsze niż 4.3 podążały za dowiązaniami symbolicznymi, gdy rekurencyjnie schodziły do drzewa katalogów (takich jak zsh
„s tcsh
” ***/*
).
Ponadto wszystkie powyższe rozwiązania będą ignorować ukryte pliki (te, których nazwa zaczyna się od .
, użyj, shopt -s dotglob
aby je uwzględnić), a także zawierać liczbę wierszy dowiązań symbolicznych (czego find
podejście nie będzie).
-xtype f
w GNU find lub *(-.)
w zsh) i pominie ukryte pliki.
%lu
w printf
? O ile pamiętam, to oznacza długi dziesiętny bez znaku, czy to naprawdę konieczne? Dlaczego nie traktować liczby jako ciągu? Czy to robi różnicę?
0
zamiast pustego ciągu, co jest nieco lepsze. Niektóre implementacje sortowania działają z liczbami całkowitymi bez znaku, niektóre z podpisanymi. %lu
brzmi jak najbezpieczniejszy zakład, ale prawdopodobnie nie ma to znaczenia, jakbyś miał 2^31
linie, które i tak potrwają wieki.
Jeśli chcesz zainstalować fd
naprawdę szybką wyszukiwarkę plików napisaną w Rust (powinieneś ją zainstalować, i tak warto ją mieć)
fd --type=file . | xargs wc -l | sort -n
Zasadniczo fd
wyświetla listę plików, xargs przekaże listę plików wc
(oznacza liczbę słów, ale przekazanie -l spowoduje, że zliczą linie), a następnie posortowane od najmniejszej liczby wierszy do największej sort -n
.
ls -l
nie podaje liczby linii.ls -lS
sortuje plik według rozmiaru za pomocą niektórychls
implementacji ( rozmiar jest liczbą bajtów w treści).