Подтвердить что ты не робот

Используйте find, wc и sed для подсчета строк

Я пытался использовать sed для подсчета всех строк на основе определенного расширения.

find -name '*.m' -exec wc -l {} \; | sed ...

Я пытался сделать следующее, как бы включить sed в эту конкретную строку, чтобы получить итоговые значения.

4b9b3361

Ответ 1

Вы также можете получить хорошее форматирование из wc с помощью:

wc `find -name '*.m'`

Ответ 2

Большинство ответов здесь не будут работать хорошо для большого количества файлов. Некоторые из них будут разбиты, если список имен файлов слишком длинный для одного вызова в командной строке, другие неэффективны, потому что -exec запускает новый процесс для каждого файла. Я считаю, что надежное и эффективное решение будет:

find . -type f -name "*.m" -print0 | xargs -0 cat | wc -l

Использование cat таким образом прекрасное, так как его вывод передается прямо в wc, поэтому только небольшое количество содержимого файлов сохраняется в памяти сразу. Если слишком много файлов для одного вызова cat, cat будет вызываться несколько раз, но весь вывод по-прежнему будет передан в один процесс wc.

Ответ 3

Вы можете cat все файлы через один экземпляр wc, чтобы получить общее количество строк:

find . -name '*.m' -exec cat {} \; | wc -l

Ответ 4

На современных платформах GNU wc найдите find -print0 и -files0 из параметров, которые могут быть объединены в команду, которая подсчитывает строки в файлах с итогом в конце. Пример:

find . -name '*.c' -type f -print0 | wc -l --files0-from=-

Ответ 5

вы можете использовать sed также для подсчета строк вместо wc:

 find . -name '*.m' -exec sed -n '$=' {} \;

где '$=' - это "специальная переменная", которая поддерживает подсчет строк

ИЗМЕНИТЬ

вы также можете попробовать что-то вроде sloccount

Ответ 6

Hm, решение с cat может быть проблематичным, если у вас много файлов, особенно больших.

Второе решение не дает итоговых, только строк на файл, как я тестировал.

Я предпочел бы что-то вроде этого:

find . -name '*.m' | xargs wc -l | tail -1

Это сделает работу быстро, независимо от того, сколько и сколько у вас больших файлов.

Ответ 7

sed не является надлежащим инструментом для подсчета. Вместо этого используйте awk:

find . -name '*.m' -exec awk '{print NR}' {} +

Использование + вместо \; силы находят вызов awk для каждого найденного N файла (например, с xargs).

Ответ 8

Для больших каталогов мы должны использовать:

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}'