Как считать строки кода включая подкаталоги [дубликат]

89
задан madth3 2 May 2013 в 22:59
поделиться

6 ответов

Сначала Вы не должны использовать cat для подсчета строк. Это антишаблон под названием Бесполезное Использование CAT (UUoC). Для подсчета строк в файлах в текущем каталоге используйте wc :

wc -l * 

Тогда эти find команда рекурсивно вызывает подкаталоги:

find . -name "*.c" -exec wc -l {} \;
  • . название главного каталога, чтобы начать искать от [1 126]

  • -name "*.c", шаблон файла, Вы интересуетесь [1 127]

  • -exec, дает команду, которая будет выполняться

  • {}, результат команды находки, которая будет передана команде (сюда wc-l)

  • \;, указывает на конец команды

, Эта команда производит список всех файлов, найденных с их количеством строки, если Вы хотите иметь сумму для [1 134] весь найденные файлы, можно использовать, находят для списка файлов (с -print опция) и, чем использование xargs для передачи этого списка как аргумента туалету-l.

find . -name "*.c" -print | xargs wc -l 

РЕДАКТИРОВАНИЕ для обращения к комментарию Robert Gamble (спасибо): если у Вас есть пробелы или новые строки (!) в именах файлов, то необходимо использовать -print0 опция вместо [1 115] и xargs -null так, чтобы списком имен файлов обменялись с завершенными пустым указателем строками.

find . -name "*.c" -print0 | xargs -0 wc -l

философия Unix должна иметь инструменты, которые делают одну вещь только и делают это хорошо.

154
ответ дан Dan Dascalescu 24 November 2019 в 07:12
поделиться

Если Вы хотите играющий в гольф код ответ:

grep '' -R . | wc -l 

проблема только с использованием туалета-l самостоятельно является им убывание наклона хорошо, и остроты с помощью [1 112]

find . -exec wc -l {} \;

не дадут Вам общее количество строки, потому что это выполняет туалет однажды для каждого файла, (loL!) и

find . -exec wc -l {} + 

запутается, как только находят хиты <глоток> ~200k 1 <глоток>, <глоток> 2 символьный предел аргумента для параметров, и вместо этого называет туалет [приблизительно 118] времена, каждый раз, только дающий Вам частичная сводка.

Кроме того, вышеупомянутое grep прием не добавит больше чем 1 строку к выводу, когда это встретится с двоичным файлом, который мог быть обстоятельно выгодным.

Для стоимости 1 дополнительного управляющего символа, можно проигнорировать двоичные файлы полностью:

 grep '' -IR . | wc -l

, Если Вы хотите выполнить строку, рассчитывает на двоичные файлы также

 grep '' -aR . | wc -l 
Сноска на пределах:

документы немного неопределенны относительно того, является ли это строка предел размера или количество маркеров предел.

cd /usr/include;
find -type f -exec perl -e 'printf qq[%s => %s\n], scalar @ARGV, length join q[ ], @ARGV' {} + 
# 4066 => 130974
# 3399 => 130955
# 3155 => 130978
# 2762 => 130991
# 3923 => 130959
# 3642 => 130989
# 4145 => 130993
# 4382 => 130989
# 4406 => 130973
# 4190 => 131000
# 4603 => 130988
# 3060 => 95435

Это подразумевает его попытку разделить на блоки очень очень легко.

30
ответ дан Community 24 November 2019 в 07:12
поделиться

Я думаю, что Вы, вероятно, застреваете с методом xargs

find -name '*php' | xargs cat | wc -l

chromakode , дает тот же результат, но намного намного медленнее. При использовании xargs Ваш кошка луг и туалет , луг может запуститься, как только находят , начинает находить.

Хорошее объяснение в Linux: xargs по сравнению с должностным лицом {}

13
ответ дан Community 24 November 2019 в 07:12
поделиться

Попытайтесь использовать эти find команда, которая рекурсивно вызывает каталоги по умолчанию:

find . -type f -execdir cat {} \; | wc -l

10
ответ дан chromakode 24 November 2019 в 07:12
поделиться

Корректный путь:

find . -name "*.c" -print0 | xargs -0 cat | wc -l

необходимо использовать-print0, потому что существует только два недопустимых символа в именах файлов Unix: пустой байт и "/" (наклонная черта). Таким образом, например, "xxx\npasswd" является допустимым именем. В действительности Вы, более вероятно, встретитесь с именами с пробелами в них, все же. Команды выше считали бы каждое слово как отдельный файл.

Вы могли бы также хотеть использовать "-тип f" вместо - имя для ограничения поиска файлами.

10
ответ дан Aaron Digulla 24 November 2019 в 07:12
поделиться

Использование cat или grep в решениях выше расточительно, если вы можете использовать относительно свежие инструменты GNU, включая Bash:

wc -l --files0-from=<(find . -name \*.c -print0)

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

8
ответ дан 24 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: