Ответы:
Вы должны использовать такую команду:
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
квалификатор glob, который вместе с n
(для числовой сортировки) определяет порядок упорядочения результатов glob. ( .
также добавлен только для проверки обычных файлов).
Это не предполагает, какой символ могут содержать имена файлов, кроме скрытых файлов (те, которые начинаются с .
). Добавьте D
спецификатор glob, если вы хотите их тоже.
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» ***/*
).
Кроме того, все вышеприведенные решения будут игнорировать скрытые файлы (те, чье имя начинается с буквы «a» .
, используйте их 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
реализациями ( размер - число байтов в содержимом).