我们有一个PHP应用程序,想要计算特定目录及其子目录下所有代码行数。
我们不需要忽略注释,因为我们只是想大致了解代码规模。
wc -l *.php
该命令对于给定的目录效果很好,但它忽略了子目录。我认为下面的注释可能起作用,但它返回74,显然不是这种情况...
find . -name '*.php' | wc -l
如何正确地语法传递包含所有子目录文件的目录?
尝试:
find . -name '*.php' | xargs wc -l
或者(当文件名包含特殊字符,比如空格时)
find . -name '*.php' | sed 's/.*/"&"/' | xargs wc -l
SLOCCount 工具 也可能有所帮助。
它可以为您指定的任何层次结构提供准确的源代码行数计数,以及一些其他统计信息。
排序输出:
find . -name '*.php' | xargs wc -l | sort -nr
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
-------------------------------------------------------------------------------
cloc
是跨平台的,因为它只是一个 Perl 脚本? - Kyle Strandnpx cloc myApp
来在不全局安装的情况下运行它。 - Marcus Hammarberg另一个一行代码解决的方法:
( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l
它适用于带有空格的名称并仅输出一个数字。
man find
.. 使用 xargs -0 的 print0 可以让您操作文件名中包含空格或其他奇怪字符的文件。 - Shizzmo( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
- Zraxwc -l **/*.php
在Bash shell中,这需要设置globstar
选项,否则**
通配符不会递归。要启用此设置,请输入:shopt -s globstar
要使这个变化永久生效,将它添加到初始化文件之一(~/.bashrc
、~/.bash_profile
等)中。
wc -l **/*.[ch]
可以找到总共15195373行。不确定您是否认为这是一个“非常低的值”。再次提醒您需要确保在Bash中启用了globstar
。您可以使用shopt globstar
进行检查。要显式启用它,请执行shopt -s globstar
。 - Michael Wild.php
文件,由于 wc
不是内置程序,它仍然会导致ARG_MAX
溢出。 - Reinstate Monica Pleasewc -l **/*.{py,yml,md,js,html}
- geogeo 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
-------------------------------------------------------------------------------
您没有指定有多少个文件或所需的输出内容。
这可能是您要找的:
find . -name '*.php' | xargs wc -l
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
这将给出总和,而不是逐个文件的结果。
在“find”后面添加“.”即可实现此功能。$ find -name \*\.php -print0 | xargs -0 cat | wc -l
- Martin Haeberlifind . -name '*.php' | xargs cat | wc -l
... 而这个会逐个文件列出行数和总行数:find . -name '*.php' | xargs wc -l
。 - OsamaBinLogin使用 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; }'
find . -name '*.c' -print0 |xargs -0 wc -l
只需要1.5秒。话虽如此,这种更快的方法(至少在OS X上)最终会多次打印“总计”,因此需要一些额外的过滤才能得到正确的总计(我在我的答案中发布了详细信息)。 - Doug Richardsoncat
表单上执行一个wc
很慢,因为系统必须先处理所有GB才能开始计算行数(使用200GB的jsons、12k个文件进行了测试)。先执行wc
然后再计算结果要快得多。 - ulkasfind . -type f -exec wc -l {} \+
或者 find . -name '*.py' -type f -exec wc -l {} \+
,
它会在输出的末尾打印出总数。如果你只关心总数,可以更进一步使用 tail
:find . -type f -exec wc -l {} \+ | tail -1
或者 find . -name '*.py' -type f -exec wc -l {} \+ | tail -1
。 - JamieJag这个工具 Tokei 可以显示一个目录中代码的统计信息。Tokei会按语言分组展示文件数、代码行数、注释行数和空行数。Tokei也可以在Mac、Linux和Windows上使用。
Tokei输出的示例如下:
$ tokei
-------------------------------------------------------------------------------
Language Files Lines Code Comments Blanks
-------------------------------------------------------------------------------
CSS 2 12 12 0 0
JavaScript 1 435 404 0 31
JSON 3 178 178 0 0
Markdown 1 9 9 0 0
Rust 10 408 259 84 65
TOML 3 69 41 17 11
YAML 1 30 25 0 5
-------------------------------------------------------------------------------
Total 21 1141 928 101 112
-------------------------------------------------------------------------------
tokei
递归地计算目录中的代码,这个问题是关于什么的? - user158对我而言,更常见和简单的方法是,假设您需要计算不同名称扩展名(比如本机文件)的文件数量:
wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )
$()
。 - Sandburg
find . -name '*.php' -o -name '*.inc' | xargs wc -l
。该命令用于计算当前目录及其子目录中所有扩展名为.php或.inc的文件的行数总和。 - rymowc
将被多次运行)。此外,它不能处理许多特殊的文件名。 - l0b0find . -name "*.php" -not -path "./tests*" | xargs wc -l
这行命令的意思是在当前目录及其子目录中查找所有后缀名为.php的文件,但排除掉路径中包含“./tests*”字符串的文件,然后使用xargs命令将这些文件名传递给wc命令,统计它们的行数。 - endre