если я хочу посчитать строки кода, тривиальная вещь
cat *.c *.h | wc -l
Но что, если у меня есть несколько подкаталогов?
recursive
source-code
Никлас
источник
источник
cat
?wc -l *.c *.h
делает то же самое.wc -l *.c *.h | tail -n 1
получить аналогичный вывод.**
, так что вы могли бы использоватьwc -l **/*.{h,c}
или что-то подобное. Обратите внимание, что в Bash, по крайней мере, эта опция ( по умолчаниюglobstar
) отключена по умолчанию. Но также учтите, что в данном конкретном случае этоcloc
илиSLOCCount
гораздо лучший вариант. (Кроме того,ack
может быть предпочтительнее, чтобыfind
легко находить / выводить список исходных файлов.)Ответы:
Самый простой способ - использовать инструмент под названием
cloc
. Используйте это так:Вот и все. :-)
источник
Вам, вероятно, следует использовать для этого SLOCCount или cloc , они предназначены специально для подсчета строк исходного кода в проекте, независимо от структуры каталогов и т. Д .; или
или
создаст отчет по всему исходному коду, начиная с текущего каталога.
Если вы хотите использовать
find
иwc
, у GNUwc
есть хорошая--files0-from
опция:(Спасибо SnakeDoc за предложение !)
источник
sloccount /tmp/stackexchange
(созданный заново 17 мая после моей последней перезагрузки) говорит, что ориентировочная стоимость разработки найденных им файлов sh, perl, awk и т. Д. Составляет 11 029 долларов. и это не включает в себя однострочники, которые никогда не превращались в файл сценария.cloc
тоже хорошо: github.com/AlDanial/clocПоскольку
wc
команда может принимать несколько аргументов, вы можете просто передать все имена файлов,wc
используя+
аргумент-exec
действия GNUfind
:Альтернативно,
bash
используя опцию shellglobstar
для рекурсивного обхода каталогов:Другие оболочки по умолчанию рекурсивно (например
zsh
) или имеют аналогичные опции, какglobstar
, по крайней мере, большинство из них.источник
Вы можете использовать
find
вместе сxargs
иwc
:источник
total
строк, еслиwc
вызывается несколько s.)wc
проблем команд могут быть решены с помощью трубопроводаfind
кwhile read FILENAME; do . . .done
структуре. И внутри цикла использования циклаwc -l
. Остальное суммирует все строки в переменную и отображает ее.Если вы находитесь в среде, где у вас нет доступа и
cloc
т.д., я бы предложилПрогон:
find
поиск рекурсивно для всех обычных файлов, имя которых заканчивается в любом.c
или.h
и работаетcat
на них. Выходные данные передаются по конвейеруgrep
для подсчета всех непустых строк (тех, которые содержат хотя бы один непробельный символ).источник
Как было отмечено в комментариях,
cat file | wc -l
это не эквивалентно,wc -l file
потому что первый печатает только число, а второй печатает число и имя файла. Аналогичноcat * | wc -l
будет напечатано только число, тогда какwc -l *
напечатает строку информации для каждого файла.В духе простоты давайте вернемся к фактически заданному вопросу:
Во-первых, вы можете упростить даже свою тривиальную команду:
И, наконец, эквивалент многих подкаталогов:
Возможно, это можно улучшить многими способами, например, ограничив сопоставляемые файлы только обычными файлами (не каталогами), добавив
-type f
- но даннаяfind
команда является точным рекурсивным эквивалентомcat *.[ch]
.источник
Образец с использованием
awk
:источник
+
вместо\;
.wc -l
для групп файлов, а какxargs
делает, но он обрабатывает нечетные шариковые символы (например , пробела) в именах файлов без необходимости либоxargs
или (нестандартная)-print0
и-0
опции кfind
иxargs
соответственно. Это небольшая оптимизация. Недостатком было бы то, что каждый вызов выводилwc
бы общее количество строк в конце, если дано несколько файлов -awk
сценарий справился бы с этим. Таким образом, это не слэм-данк, но очень часто, используя+
вместо\;
сfind
хорошей идеей.wc
. Если априори неизвестно количество файлов, которые будут найдены , есть ли риск преодолеть этот лимит или каким-то образом это обрабатывается командой find?find
группирует файлы в пакеты подходящего размера, которые не будут превышать ограничение длины для списка аргументов на платформе, учитывая среду (которая определяется длиной списка аргументов - так что длина списка аргументов плюс длина среды должна быть меньше максимальной величины). IOW,find
делает работу правильно, какxargs
делает работу правильно.легкая команда:
источник
total
строк, еслиwc
вызывается несколько s.)Если вы работаете в Linux, я рекомендую свой собственный инструмент, polyglot . Это значительно быстрее, чем
cloc
и более интересным, чемsloccount
.Вы также должны иметь возможность использовать BSD, хотя двоичных файлов не предусмотрено.
Вы можете вызвать его с
источник
find . -name \*.[ch] -print | xargs -n 1 wc -l
должен сделать свое дело. Существует также несколько возможных вариантов, например, использование-exec
вместо передачи вывода вwc
.источник
find . -name \*.[ch] -print
не печатает содержимое файлов, только имена файлов. Поэтому я считаю количество файлов, не так ли? Нужно ли мне xargs?xargs
, и вам также нужно следить за несколькимиwc
вызовами, если у вас много файлов; вам нужно искать всеtotal
строки и суммировать их.find . -name \*.[ch] -print0 | xargs -0 cat | wc -l
find . -name \*.[ch] -print | wc -l
) считает количество файлов (если имя файла не содержит символ новой строки - но это очень необычно) - оно не учитывает количество строк в файлах.