ls -l
показывает размеры файлов только на 1 уровне.
du
рекурсивно покажет размеры папок (сумма размеров файлов в папке).
Всегда можно сделать:
grep -o... | awk '{print};END{if (NR) print "\n" NR " matched."}'
Или сделать все это в awk
(, что также позволит избежать -o
и \+
GNUизмов):
awk 'match($0, /^[[:alpha:]_]+[[:blank:]]*\([[:blank:]]*\)/) {
print substr($0, RSTART, RLENGTH)
n++
}
END{if (n) print "\n" n " matched.")'
илиperl
:
perl -lne 'for (/^\w+\h*\(\h*\)/g) {print; $n++}
END {print "\n$n matched." if $n}'
(обратите внимание, что в этом случае \w
ограничен буквами ASCII, добавьте -Mopen=locale
, чтобы включить любую букву в любом алфавитном письме в соответствии с локалью, как в grep
илиawk
(некоторыеawk
)подходы)
Что касается вашего вопроса 2, это потому, что bash
(, в отличие от zsh
), не ожидает команд, запущенных в процессе подстановки, вызывая такого рода проблемы. См. Вывод замены процесса не соответствует порядку для получения более подробной информации.