我们有一个PHP应用程序,希望统计特定目录及其子目录下的所有代码行。

我们不需要忽视评论,因为我们只是想得到一个粗略的想法。

wc -l *.php 

该命令对于给定的目录非常有效,但它忽略了子目录。我想下面的评论可能有用,但它返回了74,这绝对不是这样。。。

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

重新输入目录中所有文件的正确语法是什么?


当前回答

到目前为止,没有一个答案能解决带空格的文件名问题。

此外,如果树中路径的总长度超过shell环境大小限制(在Linux中默认为几兆字节),则所有使用xargs的路径都会失败。

这是一个以非常直接的方式解决这些问题的方法。子shell处理带有空格的文件。awk汇总了单个文件wc输出的流,因此它不应该耗尽空间。它还将exec限制为仅文件(跳过目录):

find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}'

其他回答

如果使用相当新的Bash(或ZSH)版本,则要简单得多:

wc -l **/*.php

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

shopt -s globstar

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

类似于Shizzmo的回答,但更丑陋、更准确。如果您经常使用它,请将其修改为适合并放入脚本中。

此示例:

正确排除不是代码的路径(find根本不遍历)过滤出复合扩展名和您希望忽略的其他文件仅包含指定类型的实际文件忽略空行给出一个总数

find . \! \( \( -path ./lib -o -path ./node_modules -o -path ./vendor -o -path ./any/other/path/to/skip -o -wholename ./not/this/specific/file.php -o -name '*.min.js' -o -name '*.min.css' \) -prune \) -type f \( -name '*.php' -o -name '*.inc' -o -name '*.js' -o -name '*.scss' -o -name '*.css' \) -print0 | xargs -0 cat | grep -vcE '^[[:space:]]*$'

有一个叫做sloccount的小工具来计算目录中的代码行。

应该注意的是,它做的比你想要的更多,因为它忽略空行/注释,按编程语言分组结果,并计算一些统计数据。

我还可以添加另一个OS X条目,这个条目使用普通的旧find with exec(我更喜欢使用xargs,因为我在过去看到过使用xarg的非常大的查找结果集的奇怪结果)。

因为这是针对OS X的,所以我还将过滤添加到.h或.m文件中—确保将所有文件复制到最后!

find ./ -type f -name "*.[mh]" -exec wc -l {}  \; | sed -e 's/[ ]*//g' | cut -d"." -f1 | paste -sd+ - | bc

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

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