Используйте find, wc и 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
process.
Вы можете cat
всех файлов через один экземпляр wc
получить общее количество строк:
find . -name '*.m' -exec cat {} \; | wc -l
На современных платформах GNU wc и найдите параметры take -print0 и -files0-from, которые можно объединить в команду, которая считает строки в файлах с общим итогом в конце. Пример: р>
find . -name '*.c' -type f -print0 | wc -l --files0-from=-
вы могли бы использовать sed также для подсчета строк вместо wc:
find . -name '*.m' -exec sed -n '$=' {} \;
где '$='
это "специальная переменная", которая сохраняет количество строк
Редактировать
вы также могли бы попробовать что-то вроде количество слотов
Хм, решение с помощью 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}'