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

我们有一个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不是recursion的。 要启用此设置,请发出

 shopt -s globstar 

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

对于每个人坚持与Windows:

在Windows下运行一些代码行后,我发现cloc 。

和sloccount一样的目的,但在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 ------------------------------------------------------------------------------- 

你没有指定有多less文件或者什么是所需的输出。 这是你想要的:

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

又一个变化:)

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

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

对于我来说,更常见也更简单,假设你需要计算不同名称扩展名的文件(比如说本地文件)

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

有一个名为sloccount的小工具来计算目录中的代码行。 应该指出,它比你想要的要多,因为它忽略空行/注释,按照编程语言对结果进行分组,并计算一些统计数据。

令人惊讶的是,基于find的-execawk没有答案。 开始了:

 find . -type f -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }' 

这段代码find所有文件( -type f )。 要通过文件扩展名查找,请使用-name

 find . -name *.py -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }' 

POSIX

每个文件中的行:

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

每个文件中的行,按文件pathsorting

 find . -name '*.php' -type f | sort | xargs wc -l 

每个文件中的行按行数sorting,递减

 find . -name '*.php' -type f | xargs wc -l | sort -nr 

所有文件中的总行数

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

一个简单的快速,将使用所有search/筛选的力量,不会失败,当文件太多(数字参数溢出),工作正常的文件与他们的名字有趣的符号,而不使用xargs ,不会启动一个无用的高数量的外部命令(感谢find-exec + )。 干得好:

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

仅用于来源:

 wc `find` 

要过滤,只需使用grep

 wc `find | grep .php$` 

你也可以试试CLOC (需要Perl)

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

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

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

正如您所看到的,从开发人员的angular度来看,所提供的信息是非常有用的,因为在开始使用它之前,它可以粗略地告诉您项目有多复杂。

猜测没有人会看到这埋在后面…但迄今为止的答案都没有解决空间文件名的问题。 此外,如果树中的path总长度超过了shell环境大小限制(在Linux中默认为几兆字节),那么所有使用xargs都将失败。 这是一个以相当直接的方式解决这些问题的方法。 子shell使用空格来处理文件。 awk总是单个文件wc输出的stream,所以永远不应该用尽空间。 它也将exec限制为文件(跳过目录):

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

有些不同:

 wc -l `tree -if --noreport | grep -e'\.php$'` 

这工作得很好,但是你需要在当前文件夹或其子文件夹中至less有一个*.php文件,否则wc

如果您只需要总数的行数,就让我们说您的PHP文件,如果您安装了GnuWin32,则即使在Windows下也可以使用非常简单的一行命令。 喜欢这个:

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

您需要指定find.exe的确切位置,否则将执行Windows提供的FIND.EXE(来自旧DOS类命令),因为它可能位于环境PATH中的GnuWin32之前,并且具有不同的参数和结果。

请注意,在上面的命令中,你应该使用反引号,而不是单引号。

如果你希望你的结果按行数sorting,你可以添加| sort | sort| sort -r | sort -r-r降序)到第一个答案,如下所示:

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

首先给出最长的文件(也许这些长文件需要一些重构的爱),并排除一些供应商目录:

  find . -name '*.php' | xargs wc -l | sort -nr | egrep -v "libs|tmp|tests|vendor" | less 

至less在OS X上,某些其他答案中列出的find + xarg + wc命令会在大型列表中多次打印“总数”,并且没有给出完整的总数。 我可以使用下面的命令获得一个.c文件的总数:

find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'

而我喜欢脚本我更喜欢这个脚本,因为它也显示每个文件总结,只要一个总

 wc -l `find . -name "*.php"` 

对于Windows ,简单而快速的工具是LocMetrics

非常简单

 find /path -type f -name "*.php" | while read FILE do count=$(wc -l < $FILE) echo "$FILE has $count lines" done 
 $cd directory $wc -l* | sort -nr 

我的窗口系统上安装了繁忙的箱子。 所以这就是我所做的。

 ECHO OFF for /r %%G in (*.php) do ( busybox grep . "%%G" | busybox wc -l ) 

另一个命令是获得所有文件的总和(当然是Linux)

 find ./ -type f -exec wc -l {} \; | cut -d' ' -f1 | paste -sd+ | bc 

主要区别于其他答案:

  1. 使用find -exec
  2. 使用粘贴(与切)
  3. 使用bc

如果你想保持简单,就把中间人剪掉,然后用所有的文件wc

 wc -l `find . -name "*.php"` 

或者在现代语法中:

 wc -l $(find . -name "*.php") 

只要在目录名称或文件名中没有空格就行。 而且只要你没有成千上万的文件(现代shell支持真正长的命令行)。 你的项目有74个文件,所以你有很大的发展空间。