Answers:
尝试:
find . -name '*.php' | xargs wc -l
SLOCCount工具也可能会有所帮助。
它将为您指向的任何层次结构提供准确的代码计数源代码行,以及一些其他统计信息。
排序输出:
find . -name '*.php' | xargs wc -l | sort -nr
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
将多次运行。也不处理许多特殊文件名。)
find . -name "*.php" -not -path "./tests*" | xargs wc -l
对于另一种班轮:
( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l
适用于带空格的名称,仅输出一个数字。
man find
..具有xargs -0的print0,可让您处理名称中包含空格或其他怪异字符的文件
( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
如果使用最新版本的Bash(或ZSH),则要简单得多:
wc -l **/*.php
在Bash shell中,这需要设置globstar
选项,否则**
glob-operator不会递归。要启用此设置,请发出
shopt -s globstar
为了使这个永久性的,它添加到初始化文件之一(~/.bashrc
,~/.bash_profile
等等)。
globstar
设置 Bash 才能起作用。
wc -l **/*.[ch]
总共找到15195373行。不知道您是否认为这是“非常低的价值”。同样,您需要确保已globstar
在Bash中启用。您可以通过进行确认shopt globstar
。要明确启用它,请执行shopt -s globstar
。
ARG_MAX
如果您有大量.php
文件,它仍然会溢出,因为wc
它不是内置的。
find
包含空格,则可接受的答案将失败。这可以通过分别使用print0
和--null
与find
和xargs
调用来解决。
您可以使用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脚本?
在类似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
-------------------------------------------------------------------------------
您没有指定有多少文件或所需的输出是什么。这是你想要的:
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/* . }
结果接近slocount的*.py
,但它不知道*.js
,*.html
。
还有另一种变化:)
$ find . -name '*.php' | xargs cat | wc -l
编辑:这将给出总计,而不是逐个文件。
Edit2:添加.
后find
使其生效
$ find -name \*\.php -print0 | xargs -0 cat | wc -l
find . -name '*.php' | xargs cat | wc -l
...而这给出了逐个文件和总计:find . -name '*.php' | xargs wc -l
令人惊讶的是,没有基于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
。就是说,这种更快的方法(至少在OS X上是这样),最终会多次打印“总计”,因此需要进行一些额外的过滤才能获得适当的总计(我在答案中发布了详细信息)。
wc
的窗体上cat
是缓慢的,因为系统首先必须处理所有GB开始计数线(与jsons的200GB,12K文件测试)。做wc
第一,然后计算结果是远远快
find . -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
就我而言,更常见和更简单,假设您需要计算不同名称扩展名的文件(例如,本地文件)
wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )
感谢您的反馈,我已对其进行了更正。
$()
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
您想要的是一个简单的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
吗?
IFS=$'\n'
在循环之前进行设置至少会解决所有文件名中带有换行符的问题,但文件除外。其次,您没有引用'*.php'
,因此它将由shell而不是not扩展,因此find
ergo实际上不会在子目录中找到任何php文件。也是-print
多余的,因为它暗示着没有其他动作。
仅针对来源:
wc `find`
过滤,只需使用grep
wc `find | grep .php$`
一个简单而快速的文件,将使用的所有搜索/过滤功能find
,当文件太多(数字参数溢出)时不会失败,对于名称中带有有趣符号的文件可以正常使用,而无需使用xargs
,则不会启动无益地高数量的外部命令的(由于+
为find
的-exec
)。干得好:
find . -name '*.php' -type f -exec cat -- {} + | wc -l
\;
而不是+
因为我不知道该变量而已),所以此答案应该是正确的答案。
我知道这个问题被标记为 重击,但似乎您要解决的问题也与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
如您所见,从开发人员的角度来看,所提供的信息要有用得多,因为它可以粗略地告诉您项目在开始使用之前的复杂程度。
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陷阱 (计数输入,而不是行!!!)
find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc
请参阅此处,了解其他替代方案bc
:stackoverflow.com/q/926069/2400328
很简单
find /path -type f -name "*.php" | while read FILE
do
count=$(wc -l < $FILE)
echo "$FILE has $count lines"
done
对于Windows,简便快捷的工具是LocMetrics。
工具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
-------------------------------------------------------------------------------
可以按照存储库中README文件上的说明安装Tokei 。
如果仅需要PHP中的总行数,那么即使安装了GnuWin32,即使在Windows下,也可以使用非常简单的一行命令。像这样:
cat `/gnuwin32/bin/find.exe . -name *.php` | wc -l
您需要指定find.exe的确切位置,否则将执行Windows提供的FIND.EXE(来自类似于DOS的旧命令),因为它可能在环境PATH中的GnuWin32之前,并且具有不同的参数和结果。
请注意,在上面的命令中,应使用反引号,而不是单引号。
如果要保持简单,请切开中间人,然后wc
使用所有文件名进行调用:
wc -l `find . -name "*.php"`
或使用现代语法:
wc -l $(find . -name "*.php")
只要任何目录名称或文件名中都没有空格,就可以使用。而且,只要您没有成千上万个文件(现代shell支持很长的命令行)即可。您的项目有74个文件,因此您有足够的增长空间。
wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
您不需要所有这些复杂且难以记住的命令。您只需要一个名为line-counter的工具。
快速概述
这就是您获得工具的方式
$ pip install line-counter
使用line
命令来获取当前目录下的文件数和行数(递归)
$ line
Search in /Users/Morgan/Documents/Example/
file count: 4
line count: 839
如果您想了解更多细节,请使用line -d
。
$ line -d
Search in /Users/Morgan/Documents/Example/
Dir A/file C.c 72
Dir A/file D.py 268
file A.py 467
file B.c 32
file count: 4
line count: 839
这个工具最好的部分是,您可以向其中添加.gitignore
配置文件。您可以设置规则以选择或忽略要计数的文件种类,就像在'.gitignore'中所做的一样。
更多描述和用法在这里:https : //github.com/MorganZhang100/line-counter
至少在OS X上,其他一些答案中列出的find + xarg + wc命令在大型列表中多次打印“总计”,并且没有给出完整的总计。我可以使用以下命令获得.c文件的总计:
find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'