cloc是统计嵌入式C语言等项目代码行、注释行和空白行最可靠的工具,支持70+语言,能精准区分语义行类型;安装后执行cloc .即可递归统计,可排除目录、指定语言、导出CSV等。

用 cloc 统计含注释和空行的真实代码规模
cloc 是目前最靠谱的多语言代码行数统计工具,它能自动识别 70+ 种语言,区分代码行、注释行、空白行,并跳过二进制文件、构建产物(如 node_modules、target)——这点 wc 完全做不到。
安装后直接运行:
cloc .就能递归扫描当前目录。常见实操建议:
- 排除特定目录:
cloc --exclude-dir=node_modules,venv,.git .
- 只看某类语言:
cloc --by-file --include-lang=Python .
(--by-file显示每个文件明细) - 导出 CSV 方便后续处理:
cloc --csv . > report.csv
- 注意:默认不统计符号链接指向的文件;若需包含,加
--follow-links
用 wc -l 快速估算纯文本行数(但极易误算)
wc -l 只是数换行符,对源码毫无语义理解——它会把注释、空行、头文件、配置文件、日志甚至 .md 全部算进去。仅适合临时粗略查看某个单一文件或简单脚本的“总行数”。
典型误用场景和修正方式:
- 统计当前目录所有
.py文件总行数(不含子目录):wc -l *.py | tail -n1
(最后一行是总计) - 递归统计(含子目录):
find . -name "*.py" -exec cat {} + | wc -l(⚠️注意:如果文件名含空格或特殊字符,这个写法会崩;更安全用find ... -print0 | xargs -0 cat | wc -l) - 想过滤空行和注释?
wc本身做不到,得组合grep:grep -v "^[[:space:]]*$" file.py | grep -v "^#" | wc -l
(仅适用于 shell 脚本或简单 Python,对多行字符串、docstring、C++ 的//和/* */都会漏判)
为什么 cloc 的“代码行”比 wc -l 少很多?
这不是 bug,是设计差异。cloc 的“代码行”(code 列)指**有效可执行/声明语句所在的行**,它基于语法解析器判断,比如:
- Python 中
"""docstring"""块被算作注释行,不是代码行 - C/C++ 中
#include、#define算作“注释”(cloc把预处理指令归为注释类) - 同一行含代码+注释(如
int x = 0; // init),整行仍算代码行 -
wc -l对这些完全无感,只要有一个\n就加一
所以当你看到 cloc 报出 2000 行 code,而 wc -l 显示 5000 行,大概率是因为项目里有大量配置、文档、测试数据、生成代码或注释密集的模块。
别忽略 cloc 的配置文件和语言定义
cloc 自带语言识别规则(在 /usr/share/cloc/lang_def.txt 或通过 cloc --show-lang 查看),但遇到自定义 DSL、模板文件(如 .jinja、.erb)或新语言时,它可能识别失败,导致该类文件被归为 Text 或直接跳过。
- 临时指定语言:
cloc --lang-def=mydef.txt --read-lang-def=mydef.txt .
- 检查某文件被识别成什么:
cloc --debug example.config
(看 debug 输出里的language:字段) - 公司内部框架常有专属后缀(如
.vue.ts),需要手动扩展语言定义,否则统计结果失真
真正影响统计准确性的,往往不是命令怎么敲,而是你有没有确认过目标文件是否被 cloc 正确识别了语言类型。


















