19

在 python 或 bash 脚本中是否有一种快速而肮脏的方法,可以递归地下降一个目录并计算代码的总行数?我们希望能够排除某些目录。

例如:

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

这将是一个非常有用的实用程序。

4

3 回答 3

41

找到了一个很棒的实用程序 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
--------------------------------------------------------------------------------
于 2011-09-21T23:34:26.000 回答
15

单独的findandwc参数可以解决您的问题。

find您可以指定非常复杂的逻辑,如下所示:

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

这里!反转条件,因此该命令将计算不在“lib/”或“frameworks/”目录中的每个 python 文件的行数。

只是不要忘记'*',否则它不会匹配任何东西。

于 2011-09-22T05:25:35.550 回答
4
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}'

一些笔记...

  1. 这 。查找之后很重要,因为这是cut命令将计数与文件名分开的方式
  2. 这是一个多行命令,因此请确保转义斜杠后没有空格
  3. 您可能需要排除其他文件,例如 svn 或其他文件。此外,这将为二进制文件提供有趣的值,因此您可能希望使用 grep 将您感兴趣的特定文件类型列入白名单,即:grep -e .html$ -e .css$
于 2011-09-21T23:21:20.627 回答