如何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的-exec
和awk
没有答案。 开始了:
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
主要区别于其他答案:
- 使用find -exec ,
- 使用粘贴(与切) ,
- 使用bc
如果你想保持简单,就把中间人剪掉,然后用所有的文件wc
:
wc -l `find . -name "*.php"`
或者在现代语法中:
wc -l $(find . -name "*.php")
只要在目录名称或文件名中没有空格就行。 而且只要你没有成千上万的文件(现代shell支持真正长的命令行)。 你的项目有74个文件,所以你有很大的发展空间。