我们有一个PHP应用程序,并希望计算特定目录及其子目录下的所有代码行.我们不需要忽略评论,因为我们只是想弄清楚.
wc -l *.php
该命令在给定目录中运行良好,但忽略子目录.我当时认为这可行,但它正在返回74,绝对不是这样......
find . -name '*.php' | wc -l
提供所有文件的正确语法是什么?
尝试:
find . -name '*.php' | xargs wc -l
SLOCCount工具也可能有所帮助.
它将为您指定的任何层次结构提供准确的源代码行数,以及一些其他统计信息.
对于另一个单线:
( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l
适用于带空格的名称,只输出一个数字.
如果使用最新版本的Bash(或ZSH),它会更简单:
wc -l **/*.php
在Bash shell中,这需要设置globstar
选项,否则**
glob-operator不是递归的.要启用此设置,请发出
shopt -s globstar
为了使这个永久性的,它添加到初始化文件之一(~/.bashrc
,~/.bash_profile
等等).
您可以使用cloc
为此目的而构建的实用程序.它会报告每种语言的每行数量,以及其中有多少是评论等.CLOC可在Linux,Mac和Windows上使用.
用法和输出示例:
$ cloc --exclude-lang=DTD,Lua,make,Python . 2570 text files. 2200 unique files. 8654 files ignored. http://cloc.sourceforge.net v 1.53 T=8.0 s (202.4 files/s, 99198.6 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- Javascript 1506 77848 212000 366495 CSS 56 9671 20147 87695 HTML 51 1409 151 7480 XML 6 3088 1383 6222 ------------------------------------------------------------------------------- SUM: 1619 92016 233681 467892 -------------------------------------------------------------------------------
在类UNIX系统上,有一个名为cloc
提供代码统计信息的工具.
我在代码库中的一个随机目录中运行它说:
59 text files. 56 unique files. 5 files ignored. http://cloc.sourceforge.net v 1.53 T=0.5 s (108.0 files/s, 50180.0 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C 36 3060 1431 16359 C/C++ Header 16 689 393 3032 make 1 17 9 54 Teamcenter def 1 10 0 36 ------------------------------------------------------------------------------- SUM: 54 3776 1833 19481 -------------------------------------------------------------------------------
您没有指定有多少文件或所需的输出.这是你想要的:
find . -name '*.php' | xargs wc -l
又一个变种:)
$ find . -name '*.php' | xargs cat | wc -l
编辑:这将给出总和,而不是逐个文件.
令人惊讶的是,没有基于find -exec
和的答案awk
.开始了:
find . -type f -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }'
此片段可查找所有文件(-type f
).要通过文件扩展名查找,请使用-name
:
find . -name '*.py' -exec wc -l '{}' \; | awk '{ SUM += $0; } END { print SUM; }'
POSIX
与此处的大多数其他答案不同,这些答案适用于任何POSIX系统,任意数量的文件以及任何文件名(除非另有说明).
每个文件中的行:
find . -name '*.php' -type f -exec wc -l {} \; # faster, but includes total at end if there are multiple files find . -name '*.php' -type f -exec wc -l {} +
每个文件中的行,按文件路径排序
find . -name '*.php' -type f | sort | xargs -L1 wc -l # for files with spaces or newlines, use the non-standard sort -z find . -name '*.php' -type f -print0 | sort -z | xargs -0 -L1 wc -l
每个文件中的行,按行数排序,降序
find . -name '*.php' -type f -exec wc -l {} \; | sort -nr # faster, but includes total at end if there are multiple files find . -name '*.php' -type f -exec wc -l {} + | sort -nr
所有文件中的总行数
find . -name '*.php' -type f -exec cat {} + | wc -l
对我来说更常见和简单,假设您需要计算不同名称扩展名的文件(例如,也是本地人)
wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )
有一个名为sloccount的小工具可以计算目录中的代码行数.应该注意的是,它比你想要的更多,因为它忽略空行/注释,按照编程语言对结果进行分组并计算一些统计信息.
你想要的是一个简单的for
循环:
total_count=0 for file in $(find . -name *.php -print) do count=$(wc -l $file) let total_count+=count done echo "$total_count"
仅限来源:
wc `find`
要过滤,只需使用grep
wc `find | grep .php$`
一个直截了当的快速,将使用所有的搜索/过滤功能find
,当文件太多(数字参数溢出)时不会失败,与名称中有趣符号的文件一起正常工作,不使用xargs
,不会启动无益地高数量的外部命令的(由于+
为find
的-exec
).干得好:
find . -name '*.php' -type f -exec cat -- {} + | wc -l
我知道这个问题被标记为bash,但似乎你要解决的问题也与PHP有关.
塞巴斯蒂安·贝格曼(Sebastian Bergmann)编写了一个名为PHPLOC的工具,可以完成您想要的工作,并在此基础上为您提供项目复杂性的概述.这是其报告的一个例子:
Size
Lines of Code (LOC) 29047
Comment Lines of Code (CLOC) 14022 (48.27%)
Non-Comment Lines of Code (NCLOC) 15025 (51.73%)
Logical Lines of Code (LLOC) 3484 (11.99%)
Classes 3314 (95.12%)
Average Class Length 29
Average Method Length 4
Functions 153 (4.39%)
Average Function Length 1
Not in classes or functions 17 (0.49%)
Complexity
Cyclomatic Complexity / LLOC 0.51
Cyclomatic Complexity / Number of Methods 3.37
如您所见,从开发人员的角度来看,所提供的信息更有用,因为它可以粗略地告诉您在开始使用项目之前项目的复杂程度.
猜测没有人会看到这个埋在后面......然而到目前为止,没有一个答案能解决带有空格的文件名问题.此外,xargs
如果树中的路径总长度超过shell环境大小限制(Linux中默认为几兆字节),则所有使用都会失败.这是一个以非常直接的方式解决这些问题的方法.子shell使用空格处理文件.在awk
总计单个文件的流wc
输出,所以应该永远用完的空间.它还exec
仅限制to文件(跳过目录):
find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}'
WC -L?更好地使用GREP -C ^
wc -l?错误! wc命令计算新行代码,而不是行!当文件中的最后一行没有以新行代码结束时,这将不计算在内!
如果您仍想要计数行,请使用 grep -c ^,完整示例:
#this example prints line count for all found files total=0 find /path -type f -name "*.php" | while read FILE; do #you see use grep instead wc ! for properly counting count=$(grep -c ^ < "$FILE") echo "$FILE has $count lines" let total=total+count #in bash, you can convert this for another shell done echo TOTAL LINES COUNTED: $total
最后,注意wc -l陷阱 (计数输入,而不是线!!!)