Как посчитать все строки кода в каталоге рекурсивно? - PullRequest
1458 голосов
/ 31 августа 2009

У нас есть приложение PHP, и мы хотим подсчитать все строки кода в определенном каталоге и его подкаталогах. Нам не нужно игнорировать комментарии, так как мы просто пытаемся получить грубое представление.

wc -l *.php 

Эта команда прекрасно работает в данном каталоге, но игнорирует подкаталоги. Я думал, что это может сработать, но возвращается 74, что, безусловно, не так ...

find . -name '*.php' | wc -l

Какой правильный синтаксис для подачи во всех файлах?

Ответы [ 41 ]

2438 голосов
/ 31 августа 2009

Попробуйте:

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

Инструмент SLOCCount также может помочь.

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

Сортированный вывод: find . -name '*.php' | xargs wc -l | sort

438 голосов
/ 01 сентября 2009

Для другого однострочного:

( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l

работает с именами с пробелами, выводит только одно число.

377 голосов
/ 04 февраля 2013

Если используется сравнительно свежая версия Bash (или ZSH), это намного проще:

wc -l **/*.php

В оболочке Bash для этого требуется установить параметр globstar, в противном случае оператор глобуса ** не является рекурсивным. Чтобы включить этот параметр, введите

shopt -s globstar

Чтобы сделать это постоянным, добавьте его в один из файлов инициализации (~/.bashrc, ~/.bash_profile и т. Д.).

297 голосов
/ 25 февраля 2011

Вы можете использовать утилиту cloc, которая создана именно для этой цели. Он сообщает каждому количество строк на каждом языке, а также количество комментариев и т. Д. CLOC доступен в Linux, Mac и Windows.

Пример использования и вывода:

$ cloc --exclude-lang=DTD,Lua,make,Python .
    2570 text files.
    2200 unique files.                                          
    8654 files ignored.

http://cloc.sourceforge.net v 1.53  T=8.0 s (202.4 files/s, 99198.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                    1506          77848         212000         366495
CSS                             56           9671          20147          87695
HTML                            51           1409            151           7480
XML                              6           3088           1383           6222
-------------------------------------------------------------------------------
SUM:                          1619          92016         233681         467892
-------------------------------------------------------------------------------
93 голосов
/ 16 мая 2014

В UNIX-подобных системах существует инструмент под названием cloc, который предоставляет статистику кода.

Я наткнулся на случайный каталог в нашей базе кода, он говорит:

      59 text files.
      56 unique files.                              
       5 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (108.0 files/s, 50180.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               36           3060           1431          16359
C/C++ Header                    16            689            393           3032
make                             1             17              9             54
Teamcenter def                   1             10              0             36
-------------------------------------------------------------------------------
SUM:                            54           3776           1833          19481
-------------------------------------------------------------------------------
33 голосов
/ 31 августа 2009

Вы не указали, сколько там файлов или какой желаемый результат.Это то, что вы ищете:

find . -name '*.php' | xargs wc -l
23 голосов
/ 01 августа 2011

Еще один вариант:)

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

Редактировать: вместо файла за файлом будет указана общая сумма.

Edit2: добавить . после find, чтобы заставить его работать

21 голосов
/ 29 августа 2015

* POSIX 1002 *

В отличие от большинства других ответов здесь, они работают в любой системе POSIX, для любого количества файлов и с любыми именами файлов (кроме отмеченных).


Строки в каждом файле:

find . -name '*.php' -type f -exec wc -l {} \;
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} +

Строки в каждом файле, отсортированные по пути к файлу

find . -name '*.php' -type f | sort | xargs -L1 wc -l
# for files with spaces or newlines, use the non-standard sort -z
find . -name '*.php' -type f -print0 | sort -z | xargs -0 -L1 wc -l

Строки в каждом файле, отсортированные по количеству строк, по убыванию

find . -name '*.php' -type f -exec wc -l {} \; | sort -nr
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} + | sort -nr

Всего строк во всех файлах

find . -name '*.php' -type f -exec cat {} + | wc -l
18 голосов
/ 25 апреля 2013

Удивительно, но нет ответа, основанного на -exec и awk поиска. Вот и мы:

find . -type f -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }'

Этот фрагмент находит для всех файлов (-type f). Чтобы найти по расширению файла, используйте -name:

find . -name '*.py' -exec wc -l '{}' \; | awk '{ SUM += $0; } END { print SUM; }'
18 голосов
/ 06 октября 2012

Более распространенный и простой, как для меня, предположим, что вам нужно сосчитать файлы с разными расширениями имен (скажем, также нативные)

wc `find . -name '*.[h|c|cpp|php|cc]'`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...