递归统计目录中所有代码行数的方法

递归统计目录中所有代码行数的方法

技术背景

在软件开发和项目管理中,统计代码行数是一项常见的需求。它可以帮助开发者了解项目的规模,评估开发进度,以及进行成本估算等。在不同的操作系统和环境下,有多种方法可以递归地统计目录中所有代码的行数。

实现步骤

1. 使用findwc组合

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

该命令会在当前目录及其子目录中查找所有扩展名为.php的文件,并统计每个文件的行数。如果文件名包含特殊字符(如空格),可以使用以下命令:

1
find . -name '*.php' | sed 's/.*/"&"/' | xargs  wc -l

2. 使用SLOCCount工具

SLOCCount 可以准确统计指定目录层次结构中的代码行数,并提供一些额外的统计信息。

3. 使用cloc工具

cloc 可以报告每种语言的代码行数、注释行数等信息。它支持 Linux、Mac 和 Windows 系统。

1
cloc --exclude-lang=DTD,Lua,make,Python .

4. 使用Tokei工具

Tokei 可以显示目录中代码的统计信息,包括文件数量、总行数、代码行数、注释行数和空行数等。它也支持 Mac、Linux 和 Windows 系统。

1
tokei

5. 使用gocloc工具

gocloc 是一个用 Go 语言编写的代码行数统计工具,速度较快。

1
~/go/bin/gocloc /path/to/project

6. 使用pygount工具

pygount 是一个用 Python 编写的代码行数统计工具。

1
pygount --format=summary /path/to/project

7. 使用PHPLOC工具

PHPLOC 专门用于统计 PHP 项目的代码行数,并提供项目复杂度的概述。

8. 使用codel工具

codel 是一个简单的 Python 模块,用于统计代码行数并提供彩色格式化输出。

1
2
pip install codel
codel count -e .cpp .h

9. 使用 Windows PowerShell

1
dir -Recurse *.php | Get-Content | Measure-Object -Line

10. 使用 Windows 下的 GnuWin32

1
cat `/gnuwin32/bin/find.exe . -name *.php` | wc -l

11. 使用 Python 的line-counter工具

1
2
pip install line-counter
line

12. 使用polyglot工具

polyglot 是一个在 Linux 下使用的工具,速度比sloccountcloc快,且功能更丰富。

1
poly .

核心代码

统计所有.php文件的总行数

1
find . -name '*.php' -type f -exec cat -- {} + | wc -l

统计所有.php文件的行数,并按行数排序

1
find . -name '*.php' -type f -exec wc -l {} \; | sort -nr

统计所有.php文件的行数,排除某些目录

1
find . \! \( \( -path ./lib -o -path ./node_modules -o -path ./vendor -o -path ./any/other/path/to/skip -o -wholename ./not/this/specific/file.php -o -name '*.min.js' -o -name '*.min.css' \) -prune \) -type f \( -name '*.php' -o -name '*.inc' -o -name '*.js' -o -name '*.scss' -o -name '*.css' \) -print0 | xargs -0 cat | grep -vcE '^[[:space:]]*$'

最佳实践

  • 选择合适的工具:根据具体需求和操作系统选择合适的工具。如果只需要简单的代码行数统计,可以使用findwc组合;如果需要详细的统计信息,可以使用clocTokei等工具。
  • 处理特殊文件名:如果文件名包含特殊字符(如空格),可以使用sed-print0xargs -0来处理。
  • 排除不必要的文件和目录:在统计代码行数时,可以使用find-prune选项排除不必要的文件和目录,以提高统计的准确性。

常见问题

1. wc -l统计不准确

wc -l命令统计的是换行符的数量,而不是实际的行数。如果文件的最后一行没有换行符,该行将不会被统计。可以使用grep -c ^来解决这个问题。

1
2
3
4
5
6
7
total=0
find /path -type f -name "*.php" | while read FILE; do
count=$(grep -c ^ < "$FILE")
echo "$FILE has $count lines"
let total=total+count
done
echo TOTAL LINES COUNTED: $total

2. 文件名包含空格

如果文件名包含空格,使用xargs可能会导致命令出错。可以使用-print0xargs -0来处理包含空格的文件名。

1
find . -name '*.php' -print0 | xargs -0 wc -l

3. 命令行参数过长

如果目录中的文件数量过多,命令行参数可能会超过系统限制。可以使用find-exec选项和+来避免这个问题。

1
find . -name '*.php' -type f -exec wc -l {} +

递归统计目录中所有代码行数的方法
https://119291.xyz/posts/methods-to-recursively-count-lines-of-code-in-a-directory/
作者
ww
发布于
2025年5月22日
许可协议