Утилита для подсчета количества строк кода в Python или Bash

Есть ли быстрый или грязный способ либо в python, либо в bash script, который может рекурсивно спускаться по каталогу и подсчитывать общее количество строк кода? Мы хотели бы иметь возможность исключать некоторые каталоги.

Например:

start at: /apps/projects/reallycoolapp
exclude: lib/, frameworks/

Исключенные каталоги также должны быть рекурсивными. Например:

/app/projects/reallycool/lib SHOULD BE EXCLUDED
/app/projects/reallycool/modules/apple/frameworks SHOULD ALSO BE EXCLUDED

Это была бы действительно полезная утилита.

Ответы

Ответ 1

Нашел замечательную утилиту CLOC. https://github.com/AlDanial/cloc

Вот команда, которую мы выполнили:

perl cloc.pl /apps/projects/reallycoolapp --exclude-dir=lib,frameworks

И вот вывод

--------------------------------------------------------------------------------
Language                      files          blank        comment           code   
--------------------------------------------------------------------------------
PHP                              32            962           1352           2609
Javascript                        5            176            225            920
Bourne Again Shell                4             45             70            182
Bourne Shell                     12             52            113            178
HTML                              1              0              0             25
--------------------------------------------------------------------------------
SUM:                             54           1235           1760           3914
--------------------------------------------------------------------------------

Ответ 2

Только аргументы find и wc могут решить вашу проблему.

С find вы можете указать очень сложную логику следующим образом:

find /apps/projects/reallycoolapp -type f -iname '*.py' ! -path '*/lib/*' ! -path '*/frameworks/*' | xargs wc -l

Здесь ! инвертирует условие, поэтому эта команда будет считать строки для каждого файла python не в каталогах lib/или в frameworks/.

Просто не забывайте '*', или он ничего не будет соответствовать.

Ответ 3

find ./apps/projects/reallycool -type f | \
     grep -v -e /app/projects/reallycool/lib \
             -e /app/projects/reallycool/modules/apple/frameworks | \
     xargs wc -l | \
     cut -d '.' -f 1 | \
     awk 'BEGIN{total=0} {total += $1} END{print total}'

Несколько заметок...

  • . после того, как находка важна, поскольку команда cut может отделить счетчик от имени файла
  • это многострочная команда, поэтому убедитесь, что после сбрасывания косых черт нет пробелов
  • вам может потребоваться исключить другие файлы, такие как svn или что-то еще. Также это даст смешные значения для двоичных файлов, поэтому вы можете использовать grep для белого списка определенных типов файлов, которые вас интересуют, то есть: grep -e .html$ -e .css$