Чтобы найти файл с большинством строк в текущем каталоге и его подкаталогах, с zsh
:
lines() REPLY=$(wc -l < "$REPLY")
wc -l -- **/*(D.nO+lined[1])
Это определяет функцию lines
, которая будет использоваться в качестве функции сортировки glob, которая возвращает в $REPLY
количество строк файла, путь указан в $REPLY
.
Затем мы используем zsh
«s рекурсивная подстановка **/*
найти правильные файлы (.
), численно (n
) отсортированных в обратном порядке (O
) с lines
функции (+lines
) и выберите сначала одну [1]
. (D
, чтобы включить dotfiles и trapass dotdirs).
Выполнение этого со стандартными утилитами немного сложно, если вы не хотите делать предположения о том, какие имена файлов символов могут содержать (например, newline, space ...). С GNU инструментов, найденных в большинстве дистрибутивов Linux, это немного проще, так как они могут иметь дело с NUL прекращено строки:
find . -type f -exec sh -c '
for file do
size=$(wc -c < "$file") &&
printf "%s\0" "$size:$file"
done' sh {} + |
tr '\n\0' '\0\n' |
sort -rn |
head -n1 |
tr '\0' '\n'
Или с Zsh или GNU Баш синтаксисом:
biggest= max=-1
find . -type f -print0 |
{
while IFS= read -rd '' file; do
size=$(wc -l < "$file") &&
((size > max)) &&
max=$size biggest=$file
done
[[ -n $biggest ]] && printf '%s\n' "$max: $biggest"
}
'man wc' сказал бы вам' wc [OPTION] ... [FILE] ... '. 'wc' работает с файлами, а не с каталогами. – devnull
@devnull, строго говоря, каталоги - это еще один тип файлов. В системах, которые позволяют открывать и читать каталоги, такие как обычные файлы, 'wc' будет сообщать количество символов новой строки в содержимом этих каталогов (но это не то, что OP ожидает и не будет полезно) –
Вы хотите найти файл с наибольшим количеством строк или отобразить файлы с их количеством строк. –