Вопрос

Я пытался использовать 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}' 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top