У нас есть приложение PHP, и мы хотим подсчитать все строки кода в определенном каталоге и его подкаталогах. Нам не нужно игнорировать комментарии, так как мы просто пытаемся получить грубое представление.
wc -l *.php
Эта команда прекрасно работает в данном каталоге, но игнорирует подкаталоги. Я думал, что это может сработать, но возвращается 74, что, безусловно, не так ...
find . -name '*.php' | wc -l
Какой правильный синтаксис для подачи во всех файлах?
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
будет запущен многократно. Также не обрабатывает много специальных имен файлов.find . -name "*.php" -not -path "./tests*" | xargs wc -l
Для другого однострочника:
работает с именами с пробелами, выводит только одно число.
источник
man find
.. print0 с xargs -0 позволяет вам работать с файлами, в имени которых есть пробелы или другие странные символы( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Если вы используете довольно свежую версию Bash (или ZSH), это намного проще:
В оболочке Bash это требует установки
globstar
опции, в противном случае**
оператор glob не является рекурсивным. Чтобы включить этот параметр, выполните командуЧтобы сделать это постоянным, добавьте его в один из файлов инициализации (
~/.bashrc
и~/.bash_profile
т. Д.).источник
globstar
чтобы это работало.wc -l **/*.[ch]
находит в общей сложности 15195373 строк. Не уверен, считаете ли вы это «очень низким значением». Опять же, вам нужно убедиться, что выglobstar
включили в Bash. Вы можете проверить сshopt globstar
. Чтобы включить это явно, сделайтеshopt -s globstar
.ARG_MAX
если у вас большое количество.php
файлов, посколькуwc
оно не встроено.find
пробелов. Это может быть исправлено с помощьюprint0
и--null
сfind
иxargs
вызовов, соответственно.Вы можете использовать
cloc
утилиту, которая построена именно для этой цели. Он сообщает каждому количество строк на каждом языке, а также количество комментариев и т. Д. CLOC доступен в Linux, Mac и Windows.Пример использования и вывода:
источник
cloc
это кроссплатформенное, поскольку это всего лишь скрипт на Perl?В UNIX-подобных системах есть инструмент,
cloc
который предоставляет статистику кода.Я наткнулся на случайный каталог в нашей кодовой базе:
источник
choco install cloc
Вы не указали, сколько там файлов или какой желаемый результат. Это то, что вы ищите:
источник
go () { mkdir /tmp/go; [[ -f ./"$1" ]] && mv ./"$1" /tmp/go; (find ./ -type f -name "$*" -print0 | xargs -0 cat ) | wc -l; wc -l /tmp/go/*; mv /tmp/go/* . }
результаты были близки к slocount для*.py
, но он не знал*.js
,*.html
.Еще один вариант :)
Изменить: это даст общую сумму, а не файл за файлом.
Edit2: добавить
.
после,find
чтобы заставить его работатьисточник
$ find -name \*\.php -print0 | xargs -0 cat | wc -l
find . -name '*.php' | xargs cat | wc -l
... тогда как это дает файл за файлом и общую сумму:find . -name '*.php' | xargs wc -l
Удивительно, но нет ответа на основании поиска
-exec
иawk
. Вот так:Этот фрагмент находит для всех файлов (
-type f
). Чтобы найти по расширению файла, используйте-name
:источник
find . -name '*.c' -print0 |xargs -0 wc -l
. Тем не менее, этот более быстрый метод (по крайней мере, в OS X) приводит к тому, что выводит «total» несколько раз, поэтому для получения правильного итога требуется дополнительная фильтрация (подробности я опубликовал в своем ответе).wc
это в форме acat
медленно, потому что система должна сначала обработать все ГБ, чтобы начать подсчет строк (протестировано с 200 ГБ jsons, 12k файлов).wc
сначала делать, а потом считать результат намного быстрееfind . -type f -exec wc -l {} \+
илиfind . -name '*.py' -type f -exec wc -l {} \+
который печатает итог в конце вывода. Если все, что вас интересует, это общее количество, то вы можете пойти немного дальше и использоватьtail
:find . -type f -exec wc -l {} \+ | tail -1
илиfind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
Более распространенный и простой, как для меня, предположим, что вам нужно подсчитывать файлы с разными расширениями имен (скажем, также нативные)
Спасибо за отзыв, я его исправил.
источник
$()
POSIX
В отличие от большинства других ответов здесь, они работают в любой системе POSIX, для любого количества файлов и с любыми именами файлов (кроме отмеченных).
Строки в каждом файле:
Строки в каждом файле, отсортированные по пути к файлу
Строки в каждом файле, отсортированные по убыванию
Всего строк во всех файлах
источник
Есть небольшой инструмент под названием sloccount для подсчета строк кода в каталоге. Следует отметить, что он делает больше, чем вы хотите, поскольку он игнорирует пустые строки / комментарии, группирует результаты по языкам программирования и вычисляет некоторую статистику.
источник
То, что вы хотите, это простой
for
цикл:источник
xargs
?IFS=$'\n'
перед циклом, по крайней мере, исправит это для всех, кроме файлов с символами новой строки в их именах. Во-вторых, вы не цитируете'*.php'
, поэтому он будет расширяться за счет оболочки, а неfind
, и, следовательно, ergo фактически не найдет ни одного из файлов php в подкаталогах. Также-print
является избыточным, поскольку подразумевается в отсутствии других действий.только для источников:
для фильтрации, просто используйте grep
источник
Простой, который будет быстрым, будет использовать всю мощь поиска / фильтрации
find
, не сбой при слишком большом количестве файлов (переполнение аргументов чисел), отлично работает с файлами со смешными символами в имени, без использованияxargs
не запустит бесцельно большое количество внешних команд (благодаря+
заfind
«ы-exec
). Ну вот:источник
\;
вместо того,+
что я не знал об этом), этот ответ должен быть правильным ответом.Я знаю, что вопрос помечен как удар, но кажется, что проблема, которую вы пытаетесь решить, также связана с PHP.
Себастьян Бергманн написал инструмент под названием PHPLOC, который делает то, что вы хотите, и, кроме того, предоставляет вам обзор сложности проекта. Вот пример его отчета:
Как видите, предоставленная информация намного полезнее с точки зрения разработчика, поскольку она может примерно сказать вам, насколько сложен проект, прежде чем вы начнете работать с ним.
источник
Полагаю, никто никогда не увидит, что это закопано сзади ... И все же ни один из ответов до сих пор не касается проблемы имен файлов с пробелами. Кроме того, все, что используется
xargs
, может потерпеть неудачу, если общая длина путей в дереве превышает предельный размер среды оболочки (по умолчанию - несколько мегабайт в Linux). Вот тот, который решает эти проблемы довольно прямо. Подоболочка заботится о файлах с пробелами.awk
Составляет поток отдельных файловwc
выходов, поэтому никогда не должен бежать из космоса. Он также ограничиваетexec
только файлы (пропуская каталоги):источник
wc -l? Неправильно! Команда wc считает коды новых строк, а не строк! Если последняя строка в файле не заканчивается кодом новой строки, это не засчитывается!
если вы все еще хотите считать строки, используйте grep -c ^ , полный пример:
наконец, следите за ловушкой wc -l (число вводов, а не строк !!!)
источник
grep -c ^
подсчете количества неполных строк такие неполные строки не могут появиться в текстовом файле .find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc
см. Здесь для альтернативыbc
: stackoverflow.com/q/926069/2400328очень просто
источник
Если вы хотите, чтобы результаты сортировались по количеству строк, вы можете просто добавить
| sort
или| sort -r
(-r
в порядке убывания) к первому ответу, например так:источник
xargs wc -l
является числовым, на самом деле нужно будет использоватьsort -n
илиsort -nr
.Для Windows простым и быстрым инструментом является LocMetrics .
источник
Что-то другое:
Это работает нормально, но вам нужно иметь хотя бы один
*.php
файл в текущей папке или в одной из ее подпапок, иначе онwc
остановитсяисточник
Если вы работаете в Linux (и я так понимаю), я рекомендую мой инструмент polyglot . Это значительно быстрее, чем либо,
sloccount
либоcloc
более функционально, чемsloccount
.Вы можете вызвать его с
или
так что это намного удобнее для пользователя, чем какой-то замысловатый скрипт bash.
источник
С zsh globs это очень просто:
Если вы используете Bash, вам просто нужно обновить. Нет абсолютно никаких причин использовать bash.
источник
Инструмент Tokei отображает статистику о коде в каталоге. Tokei покажет количество файлов, общее количество строк в этих файлах и код, комментарии и пробелы, сгруппированные по языку. Tokei также доступен на Mac, Linux и Windows.
Пример вывода Tokei выглядит следующим образом:
Tokei можно установить, следуя инструкциям в файле README в хранилище .
источник
Если вам нужно только общее количество строк, скажем, в ваших PHP-файлах, вы можете использовать очень простую однострочную команду даже под Windows, если у вас установлен GnuWin32. Нравится:
Вам необходимо указать, где именно находится find.exe, иначе будет предоставлен Windows FIND.EXE (из старых DOS-подобных команд), поскольку он, вероятно, находится перед GnuWin32 в среде PATH и имеет другие параметры и результаты.
Обратите внимание, что в приведенной выше команде вы должны использовать обратные кавычки, а не одинарные.
источник
Сначала выдает самые длинные файлы (т. Е. Может быть, эти длинные файлы нуждаются в некотором рефакторинге?), Исключая некоторые каталоги поставщиков:
источник
Если вы хотите сохранить простоту, вырежьте посредника и просто позвоните
wc
со всеми именами файлов:Или в современном синтаксисе:
Работает, пока нет пробелов ни в одном из имен каталогов или имен файлов. И пока у вас нет десятков тысяч файлов (современные оболочки поддерживают действительно длинные командные строки). В вашем проекте 74 файла, так что у вас достаточно места для роста.
источник
wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
Вам не нужны все эти сложные и трудно запоминающиеся команды. Вам просто нужен инструмент под названием line-counter .
Краткий обзор
Вот как вы получаете инструмент
Используйте
line
команду, чтобы получить количество файлов и количество строк в текущем каталоге (рекурсивно)Если вы хотите больше деталей, просто используйте
line -d
.И лучшая часть этого инструмента, вы можете добавить
.gitignore
как настроить файл к нему. Вы можете настроить правила, чтобы выбирать или игнорировать, какие типы файлов считать так же, как в «.gitignore».Более подробное описание и использование здесь: https://github.com/MorganZhang100/line-counter
источник
Если файлов слишком много, лучше просто посмотреть общее количество строк.
источник
По крайней мере, в OS X команды find + xarg + wc, перечисленные в некоторых других ответах, печатают «total» несколько раз в больших списках, и полная сумма не указывается. Мне удалось получить единый итог для файлов .c с помощью следующей команды:
find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'
источник