Я пытался использовать sed для подсчета всех строк на основе определенного расширения.
find -name '*.m' -exec wc -l {} \; | sed ...
Я пытался сделать следующее, как бы включить sed в эту конкретную строку, чтобы получить итоговые значения.
Я пытался использовать sed для подсчета всех строк на основе определенного расширения.
find -name '*.m' -exec wc -l {} \; | sed ...
Я пытался сделать следующее, как бы включить sed в эту конкретную строку, чтобы получить итоговые значения.
Вы также можете получить хорошее форматирование из wc с помощью:
wc `find -name '*.m'`
Большинство ответов здесь не будут работать хорошо для большого количества файлов. Некоторые из них будут разбиты, если список имен файлов слишком длинный для одного вызова в командной строке, другие неэффективны, потому что -exec
запускает новый процесс для каждого файла. Я считаю, что надежное и эффективное решение будет:
find . -type f -name "*.m" -print0 | xargs -0 cat | wc -l
Использование cat
таким образом прекрасное, так как его вывод передается прямо в wc
, поэтому только небольшое количество содержимого файлов сохраняется в памяти сразу. Если слишком много файлов для одного вызова cat
, cat
будет вызываться несколько раз, но весь вывод по-прежнему будет передан в один процесс wc
.
Вы можете cat
все файлы через один экземпляр wc
, чтобы получить общее количество строк:
find . -name '*.m' -exec cat {} \; | wc -l
На современных платформах GNU wc найдите find -print0 и -files0 из параметров, которые могут быть объединены в команду, которая подсчитывает строки в файлах с итогом в конце. Пример:
find . -name '*.c' -type f -print0 | wc -l --files0-from=-
вы можете использовать sed также для подсчета строк вместо wc:
find . -name '*.m' -exec sed -n '$=' {} \;
где '$='
- это "специальная переменная", которая поддерживает подсчет строк
ИЗМЕНИТЬ
вы также можете попробовать что-то вроде sloccount
Hm, решение с cat может быть проблематичным, если у вас много файлов, особенно больших.
Второе решение не дает итоговых, только строк на файл, как я тестировал.
Я предпочел бы что-то вроде этого:
find . -name '*.m' | xargs wc -l | tail -1
Это сделает работу быстро, независимо от того, сколько и сколько у вас больших файлов.
sed не является надлежащим инструментом для подсчета. Вместо этого используйте awk:
find . -name '*.m' -exec awk '{print NR}' {} +
Использование + вместо \; силы находят вызов awk для каждого найденного N файла (например, с xargs).
Для больших каталогов мы должны использовать:
find . -type f -name '*.m' -exec sed -n '$=' '{}' + 2>/dev/null | awk '{ total+=$1 }END{print total}'
# alternative using awk twice
find . -type f -name '*.m' -exec awk 'END {print NR}' '{}' + 2>/dev/null | awk '{ total+=$1 }END{print total}'