Відповіді:
Ви повинні використовувати таку команду:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: пошук файлів на потрібному шляху. Якщо ви не хочете, щоб він був рекурсивним, а ваша find
реалізація підтримує його, слід додати -maxdepth 1
безпосередньо перед цим -exec
параметром.exec
: вказує команду на виконання wc -l
кожного файлу.sort -rn
: сортувати результати чисельно у зворотному порядку. Від більшої до нижчої.(що передбачає, що назви файлів не містять символів нового рядка).
wc
також буде надруковано total
рядок, тож тут ви також отримаєте один або кілька "загальних" рядків, якщо тільки один файл не буде . Ви можете grep /
видалити їх, щоб видалити їх.
sort
командування
Мабуть, найпростіша версія, якщо вам не потрібна рекурсивність:
wc -l /group/book/four/word/*|sort -n
wc
підраховує рядки (параметр -l
) у всіх (але прихованих) ( *
) файлах під /group/book/four/word/
, і sort
сортує результат (через трубу |
) чисельно (опція -n
).
Хтось коментував цю відповідь, згадуючи grep -rlc
, перш ніж придушити її. Дійсно grep
, це чудова альтернатива, особливо якщо вам потрібна рекурсивність:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
буде враховувати (варіант -c
) рекурсивно (варіант -r
) рядки, що відповідають ( grep
) '^'
(тобто початку рядків) у каталозі /group/book/four/word/
. Тоді вам потрібно замінити двокрапку пробілом, наприклад, використовуючи tr
для довідки sort
, яку ви хочете впорядкувати чисельно (опцію -n
) у другому стовпці (варіант -k2
).
Оновлення: Дивіться коментар Стефана про можливі обмеження та про те, як можна насправді позбутися tr
.
grep -c .
підраховує рядки, що містять принаймні один дійсний символ. Використовуйте grep -c '^'
для підрахунку всіх рядків (також буде підраховано символи після останнього нового рядка з деякими grep
реалізаціями). Зауважте, що не всі grep
реалізації підтримують функцію a, -r
а поведінка відрізняється між тими, що є. Вам не потрібно перекладати :
s (двокрапка, а не крапка з комою) у пробіли для sort
. Просто використовуйте -t:
. Зауважте, що припускаючи, що імена файлів не містять :
чи пусті чи символи нового рядка.
wc
дав такий корисний загальний результат усім, якщо пройдеш кілька шляхів. З'єднання цієї функціональності з підключенням і підключенням sort
дійсно чисте.
З zsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
Ми визначаємо нову функцію сортування,lines
яка відповідає кількості рядків у файлі. І ми використовуємо o+lines
класифікатор глобу, який разом з n
(для числового сортування) визначає, як упорядковуються результати глобуса. ( .
також додано лише для перевірки звичайних файлів).
Це не припускає, що імена файлів можуть містити інші, ніж приховані файли (ті, що починаються з .
), опущені. Додайте D
глобальний кваліфікатор, якщо ви хочете і їх.
bash
лише ...
Ви не вказуєте, чи бажаєте ви також файли в будь-яких підкаталогах /group/book/four/word
. find
Рішення у відповідь jherran ігрова спуститься в підкаталоги. Якщо цього не потрібно, скористайтеся оболонкою:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Якщо імена файлів можуть містити нові рядки, ви можете використовувати щось на зразок:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
І, нарешті, якщо ви робите покупку сходити в підкаталоги, ви можете використовувати це в bash
4 або вище:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Зауважте, що версії bash
до 4.3 були наступними символьними посиланнями при рекурсивному зниженні дерева каталогів (наприклад zsh
, s або tcsh
s ***/*
).
Крім того, всі рішення, наведені вище, ігнорують приховані файли (ті, ім’я яких починається з а .
, використовуйте shopt -s dotglob
для їх включення), а також включатимуть кількість рядків символічних посилань (яких find
підхід не буде).
-xtype f
у GNU find або *(-.)
в zsh) і опускатиме приховані файли.
%lu
в printf
? Наскільки я пам’ятаю, це означає довгий неподписаний десятковий, чи справді це потрібно? Чому б не трактувати число як рядок? Чи має значення це?
0
замість порожнього рядка, що трохи краще. Деякі варіанти реалізації працюють з непідписаними цілими числами, а деякі з підписаними. %lu
звучить як найбезпечніша ставка, але це, мабуть, не має значення, як якщо у вас є 2^31
рядки, які все одно пройдуть віки.
Якщо ви хочете встановити fd
справді швидкий пошук файлів, написаний на Rust (вам слід встановити його, все одно здорово)
fd --type=file . | xargs wc -l | sort -n
В основному fd
списки файлів, xargs передасть список файлів wc
(означає кількість слів, але при передачі -l змусить її рахувати рядки), а потім нарешті відсортовано від найменшої кількості рядків до найбільшого використання sort -n
.
ls -l
не вказує кількість рядків.ls -lS
сортує файл за розміром з деякимиls
реалізаціями ( розмір - кількість байтів у вмісті).