题 如何递归地计算目录中的所有代码行?


我们有一个PHP应用程序,并希望计算特定目录及其子目录下的所有代码行。我们不需要忽略评论,因为我们只是想弄清楚。

wc -l *.php 

该命令在给定目录中运行良好,但忽略子目录。我当时认为这可行,但它正在返回74,绝对不是这样......

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

提供所有文件的正确语法是什么?


1260
2017-08-31 17:42


起源


完全重复 如何计算代码行,包括子目录 - Dan Dascalescu


答案:


尝试:

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

SLOCCount工具 可能也有帮助。

无论如何,它都会提供准确的源代码行数 你指出它的层次结构,以及一些额外的统计数据。


2154
2017-08-31 17:50



cloc.sourceforge.net 可能值得看作sloccount的替代品(更多语言,但信息更少) - AsTeR
包含文件还包括: find . -name '*.php' -o -name '*.inc' | xargs wc -l - rymo
当有许多文件时,这将打印多个号码(因为 wc 将多次运行。也不处理许多特殊文件名。 - l0b0
@idober: find . -name "*.php" -not -path "./tests*" | xargs wc -l - endre
如果目录名包含任何空格......以上命令失败!! - nitish712


对于另一个单线:

( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l

适用于带空格的名称,只输出一个数字。


394
2017-08-31 20:26



+1为 -print0/-0 - Dennis Williamson
+1 ditto ...永远搜索...所有其他“查找”命令只返回实际文件的数量.... -print0这里的东西得到了我的实际行数!谢谢! - Ronedog
@ TorbenGundtofte-Bruun - 看 man find .. print0 with xargs -0允许您操作名称中包含空格或其他奇怪字符的文件 - Shizzmo
@ TorbenGundtofte-Bruun - 同样,xargs中的-0对应于print0,它是一种处理空间的编码/解码。 - Tristan Reid
如果您需要多个名称过滤器,我发现(至少使用MS的MSYSGit版本),您需要额外的parens: ( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l - Zrax


如果使用最新版本的Bash(或ZSH),它会更简单:

wc -l **/*.php

在Bash shell中,这需要 globstar 选项设置,否则 ** glob-operator不是递归的。要启用此设置,请发出

shopt -s globstar

要使其永久化,请将其添加到其中一个初始化文件中(~/.bashrc~/.bash_profile 等等。)。


350
2018-02-04 15:11



为了简单起见,我赞成这一点,但是我只想指出它似乎没有递归地搜索目录,它只检查当前目录的子目录。这是在SL6.3上。 - Godric Seer
这取决于您的shell和您设置的选项。 Bash要求 globstar 要设置 为了这个工作。 - Michael Wild
@MichaelWild,如果我需要更多的代码行,那该怎么办呢?它为Linux内核返回一个非常低的值... - Peter Senna
@PeterSenna,使用当前的3.9.8内核存档,命令 wc -l **/*.[ch] 共找到15195373行。不确定你是否认为这是一个“非常低的价值”。同样,你需要确保你拥有 globstar 在Bash中启用。你可以查看 shopt globstar。要明确启用它,请执行 shopt -s globstar。 - Michael Wild
@MichaelWild这是一个很好的解决方案,但它仍然会溢出 ARG_MAX 如果你有大量的 .php 文件,因为 wc 不是内置的。 - BroSlow


你可以使用 cloc 为此目的而建造的实用程序。它会报告每种语言的每行数量,以及其中有多少是评论等。

用法和输出示例:

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

216
2018-02-25 18:29



这是一个可爱的工具,运行良好,并在最后快速提供有用的统计数据。爱它。 - Rob Forrest
它可以很好地在Unix上运行。而且只是一个脚本。 - bobah
请注意,您可以使用cygwin(或其他类似的端口/环境)在Windows上运行Unix命令。对我来说,拥有这种非常有用的访问权限,这是必要的。 unix命令行很神奇。我特别喜欢perl和正则表达式。 - Curtis Yallop
CLOC和SLOCCount在2015年中期的macbook上运行良好。请注意,对于127k Java Android项目,它们的数字很接近但不完全相同。另请注意,iOS等价物有2倍的LoC;因此,SLOCCount中的“成本”指标可能会关闭(或者iOS开发可能是Android开发者的2倍。:-) - maxweber
你会考虑编辑这个问题的开头,以明确这一点 cloc 是跨平台的,因为它只是一个Perl脚本? - Kyle Strand


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

87
2018-05-16 16:03



这是CLOC的网站: cloc.sourceforge.net - Gabriel
这与simao在2011年已经给出的答案相同。 - Martin Thoma
@moose技术上simtao特别提到它作为Windows用户的解决方案,根本没有提到linux或unix。 - Tim Seguine
@moose Table在我的答案之后被编辑到他的答案中,现在这两个确实看起来很相似。 - Calmarius
@ManoelVilela cloc =“计算代码行” - Michael Geary


您没有指定存在多少文件或所需的输出。 这是你想要的:

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

30
2017-08-31 17:48



只要没有太多文件,这将有效:如果有很多文件,结果会得到几行(xargs会将文件列表分成几个子列表) - Pascal MARTIN
是啊。这就是为什么我说他没有说明有多少文件。我的版本更容易记住,但如果您有多个文件,Shin的版本会更好。我正在投票。 - Paweł Polewicz
我需要调整它以用于函数,其中单引号过于严格: go () { mkdir /tmp/go; [[ -f ./"$1" ]] && mv ./"$1" /tmp/go; (find ./ -type f -name "$*" -print0 | xargs -0 cat ) | wc -l; wc -l /tmp/go/*; mv /tmp/go/* . }   结果接近结果 *.py,但它不知道 *.js, *.html。 - jalanb


又一个变种:)

$ find -name '*.php' | xargs cat | wc -l

编辑:这将给出总和,而不是逐个文件。


20
2017-08-01 12:01



这使用了反模式!无用的猫! - josh123a123
@ josh123a123,有更好的想法如何给出一个聚合? - Motiejus Jakštys
接受的答案就是这样:找到。 -name'* .php'| xargs wc -l如果你会注意到这条线超过了cat的需要,并直接将find的结果添加到wc的参数中。你的答案是将结果从发现传递到cat然后传递给wc,cat是一个不必要的步骤。 - josh123a123
我的回答做了不同的事情 - 它总结了所有文件的代码行。编辑了回复。 - Motiejus Jakštys
两个答案总结线。 - josh123a123


有一个叫做的小工具 sloccount 计算目录中的代码行数。应该注意的是,它比你想要的更多,因为它忽略了空行/注释,将每个编程语言的结果分组并计算一些统计信息。


17
2017-08-31 17:52





对我来说更常见和简单,假设您需要计算不同名称扩展名的文件(例如,也是本地人)

wc `find . -name '*.[h|c|cpp|php|cc]'`

17
2017-10-06 03:23



这并不是你想的那么好。找 。 -名称 '。[am]'与发现相同。 -名称 '。[a | m]'都会找到所有以.m或.a结尾的文件 - Omry Yadan
但第二个也会找到以。|结尾的文件,如果有的话。所以[h | c | cpp | php | cc]最终与[hcp |]相同。 - OsamaBinLogin