当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何递归计算目录中的所有代码行?》经验,为你挑选了17个好方法。

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

wc -l *.php 

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

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

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



1> 小智..:

尝试:

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

SLOCCount工具也可能有所帮助.

它将为您指定的任何层次结构提供准确的源代码行数,以及一些其他统计信息.


当有很多文件时,这将打印多个数字(因为`wc`将多次运行.也不会处理许多特殊文件名.
@idober:`找到.-name"*.php"-not -path"./tests*"| xargs wc -l`
包含文件:`find.-name'*.php'-o -name'*.inc'| xargs wc -l`
http://cloc.sourceforge.net/可能值得作为sloccount的替代品(更多语言,但信息更少)
如果目录名包含任何空格......以上命令失败!!
@ nitish712 find和xargs分别使用`-print0`和`-0`选项处理空间问题.所以你可以试试像`find.-name"*.php"-print0 | xargs -0 wc -l`
这应该排除空行`$ find.-name'*.php'| xargs cat | awk'/ [a-zA-Z0-9]/{i ++} END {print i}'`
这应该是一个解决方法:`找到.-name'*.php'| awk'{gsub("","\\",$ 0); print $ 0}'| xargs wc -l`
顺便说一句,xargs在Windows shell中本身不可用,但如果您碰巧安装了git,那么这个解决方案在git bash中运行良好.
在Ubuntu上的`sudo apt-get install sloccount`.然后`$ sloccount mydir`

2> Shizzmo..:

对于另一个单线:

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

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


如果您需要多个名称过滤器,我发现(至少使用查找的MSYSGit版本),您需要额外的parens:`(find.\( - name'*.h'-o -name'*. cpp'\) - print0 | xargs -0 cat)| wc -l`
@ TorbenGundtofte-Bruun - 参见`man find` .. print0 with xargs -0允许你操作名字中有空格或其他奇怪字符的文件
@ TorbenGundtofte-Bruun - 同样,xargs中的-0对应于print0,它是一种处理空间的编码/解码.

3> Michael Wild..:

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

wc -l **/*.php

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

shopt -s globstar

为了使这个永久性的,它添加到初始化文件之一(~/.bashrc,~/.bash_profile等等).


为了简单起见,我赞成这一点,但是我只想指出它似乎没有递归地搜索目录,它只检查当前目录的子目录.这是在SL6.3上.
这取决于您的shell和您设置的选项.Bash需要[`globstar`设置](http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching)才能生效.
@MichaelWild这是一个很好的解决方案,但如果你有大量的`.php`文件,它仍会溢出`ARG_MAX`,因为`wc`不是内置的.
@PeterSenna,使用当前的3.9.8内核存档,命令`wc -l**/*.[ch]`总共找到15195373行.不确定你是否认为这是一个"非常低的价值".同样,你需要确保在Bash中启用了`globstar`.你可以查看`shopt globstar`.要明确启用它,请执行`shopt -s globstar`.

4> simao..:

您可以使用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上运行.而且只是一个脚本.
请注意,您可以使用cygwin(或其他类似的端口/环境)在Windows上运行Unix命令.对我来说,拥有这种非常有用的访问权限,这是必要的.unix命令行很神奇.我特别喜欢perl和正则表达式.
这是一个可爱的工具,运行良好,并在最后快速提供有用的统计数据.爱它.
你会考虑编辑这个问题的开头,以明确"cloc"是跨平台的,因为它只是一个Perl脚本吗?

5> Calmarius..:

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


这与simao在2011年已经给出的答案相同.
@moose Table被编辑到他的答案中的时间远远晚于我的答案,现在这两个确实看起来很相似.
@ManoelVilela cloc ="计算代码行"
@moose技术上simtao特别提到它作为Windows用户的解决方案,根本没有提到linux或unix.

6> Paweł Polewi..:

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

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


只要没有太多文件,这将有效:如果有很多文件,你会得到几行(xargs会将文件列表分成几个子列表)

7> Motiejus Jak..:

又一个变种:)

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

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



8> jonhattan..:

令人惊讶的是,没有基于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; }'


从功能上来说,这很完美,但是在大型列表(Linux源代码)上,它确实很慢,因为它为每个文件启动一个wc进程,而不是为所有文件启动1 wc进程。我使用这种方法将其定为31秒,而使用`find则定为1.5秒。-name'* .c'-print0 | xargs -0 wc -l`。就是说,这种更快的方法(至少在OS X上是这样),最终会多次打印“总计”,因此需要进行一些额外的过滤才能获得适当的总计(我在答案中发布了详细信息)。

9> Paul Draper..:

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



10> sergeych..:

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

wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )


这并没有你想的那么做.找 .-name'*.[am]'与find相同.-name'*.[a | m]'都会找到所有以.m或.a结尾的文件

11> sebasgo..:

有一个名为sloccount的小工具可以计算目录中的代码行数.应该注意的是,它比你想要的更多,因为它忽略空行/注释,按照编程语言对结果进行分组并计算一些统计信息.



12> ennuikiller..:

你想要的是一个简单的for循环:

total_count=0
for file in $(find . -name *.php -print)
do
    count=$(wc -l $file)
    let total_count+=count
done
echo "$total_count"


如果你的文件名包含新行,我会说你有更大的问题.
不,内森.xargs答案不一定将计数打印为单个数字.它可能只打印一堆小计.
与提出"xargs"的答案相比,这不是太过分了吗?
如果文件名包含空格,该程序将执行什么操作?换行怎么样?;-)
@ennuikiller与此相关的问题很多,首先,它会在带有空格的文件上中断。在循环之前设置`IFS = $'\ n'`至少可以解决所有文件名中带有换行符的问题。其次,您没有引用`* .php',因此它会被shell而不是find扩展,因此ergo实际上不会在子目录中找到任何php文件。同样,“-print”是多余的,因为它暗示着没有其他动作。

13> 小智..:

仅限来源:

wc `find`

要过滤,只需使用grep

wc `find | grep .php$`



14> gniourf_gnio..:

一个直截了当的快速,将使用所有的搜索/过滤功能find,当文件太多(数字参数溢出)时不会失败,与名称中有趣符号的文件一起正常工作,不使用xargs,不会启动无益地高数量的外部命令的(由于+find-exec).干得好:

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


我本打算自己发布一个变体(用`\;`而不是'+`,因为我不知道它),这个答案应该是正确的答案.

15> Ja͢ck..:

我知道这个问题被标记为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

如您所见,从开发人员的角度来看,所提供的信息更有用,因为它可以粗略地告诉您在开始使用项目之前项目的复杂程度.



16> Gene..:

猜测没有人会看到这个埋在后面......然而到目前为止,没有一个答案能解决带有空格的文件名问题.此外,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}' 



17> Znik..:

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陷阱 (计数输入,而不是线!!!)

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有