计算 Python 或 Bash 代码行数的工具

20 投票
3 回答
13508 浏览
提问于 2025-04-17 02:48

有没有一种简单粗暴的方法,可以用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

这个工具会非常有用。

3 个回答

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. find 后面的点(.)很重要,因为这是 cut 命令用来分开文件数量和文件名的方式。
  2. 这是一个多行命令,所以确保在转义符号后面没有空格。
  3. 你可能需要排除其他文件,比如 svn 之类的。此外,对于二进制文件,这个命令可能会给出奇怪的值,所以你可能想用 grep 来过滤出你感兴趣的特定文件类型,比如:grep -e .html$ -e .css$
15

单靠 findwc 的参数就能解决你的问题。

使用 find 命令,你可以指定非常复杂的逻辑,比如这样:

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

这里的 ! 是用来反转条件的,所以这个命令会统计每个 Python 文件的行数,但不包括在 'lib/' 或 'frameworks/' 目录下的文件。

记得不要忘了 *,否则它将不会匹配任何东西。

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
--------------------------------------------------------------------------------

撰写回答