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

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

wc -l *.php 

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

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

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

Ответы [ 41 ]

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

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

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

То, что вы хотите, это простой for цикл:

total_count=0
for file in $(find . -name *.php -print)
do
    count=$(wc -l $file)
    let total_count+=count
done
echo "$total_count"
11 голосов
/ 25 ноября 2011

только для источников:

wc `find`

для фильтрации, просто используйте grep

wc `find | grep .php$`
11 голосов
/ 10 июля 2013

Простой и быстрый, который будет использовать все возможности поиска / фильтрации find, не сбой при слишком большом количестве файлов (переполнение аргументов чисел), отлично работает с файлами с забавными символами в имени, без использование xargs не будет запускать бесполезно большое количество внешних команд (спасибо + за find -exec). Вот, пожалуйста:

find . -name '*.php' -type f -exec cat -- {} + | wc -l
7 голосов
/ 01 ноября 2013

Я знаю, что вопрос помечен как , но похоже, что проблема, которую вы пытаетесь решить, также связана с PHP.

Себастьян Бергманн написал инструмент под названием PHPLOC , который делает то, что вы хотите, и, кроме того, дает вам обзор сложности проекта. Вот пример его отчета:

Size
  Lines of Code (LOC)                            29047
  Comment Lines of Code (CLOC)                   14022 (48.27%)
  Non-Comment Lines of Code (NCLOC)              15025 (51.73%)
  Logical Lines of Code (LLOC)                    3484 (11.99%)
    Classes                                       3314 (95.12%)
      Average Class Length                          29
      Average Method Length                          4
    Functions                                      153 (4.39%)
      Average Function Length                        1
    Not in classes or functions                     17 (0.49%)

Complexity
  Cyclomatic Complexity / LLOC                    0.51
  Cyclomatic Complexity / Number of Methods       3.37

Как видите, предоставленная информация намного полезнее с точки зрения разработчика, поскольку она может примерно сказать вам, насколько сложен проект, прежде чем вы начнете с ним работать.

7 голосов
/ 28 апреля 2015

Предположение, что никто никогда не увидит это похороненным сзади ... Тем не менее, ни один из ответов до сих пор не касается проблемы имен файлов с пробелами. Кроме того, все, кто использует xargs, могут потерпеть неудачу, если общая длина путей в дереве превышает ограничение размера среды оболочки (по умолчанию в Linux несколько мегабайт). Вот тот, который решает эти проблемы довольно прямо. Подоболочка заботится о файлах с пробелами. awk суммирует поток отдельных выходных файлов wc, поэтому никогда не должно заканчиваться свободное место. Он также ограничивает exec только файлами (пропуская каталоги):

find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}' 
5 голосов
/ 10 июля 2013

WC -L? лучше использовать GREP -C ^

wc -l? Неправильно! Команда wc считает новые коды строк, не строк! Если последняя строка в файле не заканчивается кодом новой строки, это не будет учитываться!

если вы все еще хотите подсчитать строки, используйте grep -c ^ , полный пример:

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED:  $total

наконец, следите за ловушкой wc -l (число входит, а не строки !!!)

4 голосов
/ 26 октября 2018

С zsh globs очень просто:

wc -l ./**/*.php

Если вы используете Bash, вам просто нужно обновить. Нет абсолютно никаких причин использовать bash.

4 голосов
/ 14 декабря 2012

Если вы хотите, чтобы результаты сортировались по количеству строк, вы можете просто добавить | sort или | sort -r (-r в порядке убывания) к первому ответу, например так:

find . -name '*.php' | xargs wc -l | sort -r
4 голосов
/ 02 февраля 2013

Что-то другое:

wc -l `tree -if --noreport | grep -e'\.php$'`

Это работает нормально, но вам нужно иметь хотя бы один *.php файл в текущей папке или одной из ее подпапок, или же wc stalls

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...