尝试:
find . -name '*.php' | xargs wc -l
或(当文件名包含空格等特殊字符时)
find . -name '*.php' | sed 's/.*/"&"/' | xargs wc -l
The SLOCCount tool 也可能有所帮助。
它将为您指向的任何层次结构提供准确的源代码行数,以及一些额外的统计信息。
排序输出:
find . -name '*.php' | xargs wc -l | sort -nr
对于另一个单行:
( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l
它适用于带有空格的名称,并且只输出一个数字。
man find
.. print0 和 xargs -0 让您可以对名称中包含空格或其他奇怪字符的文件进行操作
( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
您可以使用专为此目的而构建的 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 脚本?
如果使用最新版本的 Bash(或 ZSH),则要简单得多:
wc -l **/*.php
在 Bash shell 中,这需要设置 globstar
选项,否则 **
全局运算符不是递归的。要启用此设置,请发出
shopt -s globstar
要使其永久化,请将其添加到初始化文件之一(~/.bashrc
、~/.bash_profile
等)。
globstar
to be set 才能工作。
wc -l **/*.[ch]
总共找到 15195373 行。不确定您是否认为这是“非常低的价值”。同样,您需要确保在 Bash 中启用了 globstar
。您可以使用 shopt globstar
检查。要显式启用它,请执行 shopt -s globstar
。
.php
文件,它仍然会溢出 ARG_MAX
,因为 wc
不是内置的。
find
生成的路径包含空格,则接受的答案将失败。这可以通过分别对 find
和 xargs
调用使用 print0
和 --null
来解决。
在类 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
-------------------------------------------------------------------------------
choco install cloc
您没有指定有多少文件或所需的输出是什么。
这可能是您正在寻找的:
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
的 slocount,但它不知道 *.js
、*.html
。
还有另一种变化:)
$ find . -name '*.php' | xargs cat | wc -l
这将给出总和,而不是逐个文件。
在 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
时为 1.5 秒。也就是说,这种更快的方法(至少在 OS X 上)最终会打印“总计”多次,因此需要进行一些额外的过滤才能获得正确的总计(我在答案中发布了详细信息)。
cat
的形式上执行一个 wc
很慢,因为系统首先必须处理所有 GB 才能开始计算行数(使用 200GB 的 jsons、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
工具 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
-------------------------------------------------------------------------------
可以按照 the instructions on the README file in the repository 安装 Tokei。
有一个名为 sloccount 的小工具可以计算目录中的代码行数。
应该注意的是,它所做的比您想要的要多,因为它忽略了空行/注释,按编程语言对结果进行分组并计算一些统计数据。
您需要一个简单的 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 而不是 find
扩展,因此实际上不会在子目录中找到任何 php 文件。 -print
也是多余的,因为它隐含在没有其他操作的情况下。
一个简单的快速的,将使用 find
的所有搜索/过滤功能,当文件太多时不会失败(数字参数溢出),可以很好地处理名称中带有有趣符号的文件,而不使用 {2 },并且不会启动大量无用的外部命令(感谢 find
的 -exec
的 +
)。干得好:
find . -name '*.php' -type f -exec cat -- {} + | wc -l
\;
而不是 +
,因为我不知道),这个答案应该是正确的答案。
cat
,而 \+
版本将在一次调用中将找到的所有文件提供给 cat
。 --
用于标记选项的结束(这里有点不必要)。
我知道该问题被标记为 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
如您所见,从开发人员的角度来看,提供的信息要有用得多,因为它可以在您开始使用项目之前大致告诉您项目的复杂程度。
到目前为止,没有一个答案涉及带空格的文件名问题。
此外,如果树中路径的总长度超过 shell 环境大小限制(Linux 中默认为几兆字节),则所有使用 xargs
的操作都会失败。
这是一个以非常直接的方式解决这些问题的方法。子shell 负责处理带有空格的文件。 awk
总计单个文件 wc
输出的流,因此它永远不会耗尽空间。它还将 exec
限制为仅文件(跳过目录):
find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}'
如果您想保持简单,请去掉中间人,只需使用所有文件名调用 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`
WC-L ?更好地使用 GREP -C ^
wc -l
? 错了!
wc 命令计算新行代码,not 行!当文件的最后一行没有以换行码结束时,不计算在内!
如果您仍然想要计算行数,请使用 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 of '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 . -name '*.php' | xargs wc -l | sort -nr | egrep -v "libs|tmp|tests|vendor" | less
对于 Windows,一个简单快捷的工具是 LocMetrics。
您可以使用名为 codel
(link) 的实用程序。这是一个简单的 Python 模块,可以用彩色格式计算行数。
安装
pip install codel
用法
要计算 C++ 文件的行数(带有 .cpp
和 .h
扩展名),请使用:
codel count -e .cpp .h
您还可以忽略一些 .gitignore 格式的文件/文件夹:
codel count -e .py -i tests/**
它将忽略 tests/
文件夹中的所有文件。
输出如下所示:
https://i.stack.imgur.com/dNckF.jpg
您还可以使用 -s
标志缩短输出。它将隐藏每个文件的信息并仅显示有关每个扩展名的信息。示例如下:
https://i.stack.imgur.com/ctJED.jpg
如果您希望结果按行数排序,只需将 | sort
或 | sort -r
(-r
用于降序)添加到第一个答案,如下所示:
find . -name '*.php' | xargs wc -l | sort -r
xargs wc -l
的输出是数字,因此实际上需要使用 sort -n
或 sort -nr
。
很简单:
find /path -type f -name "*.php" | while read FILE
do
count=$(wc -l < $FILE)
echo "$FILE has $count lines"
done
有些不同:
wc -l `tree -if --noreport | grep -e'\.php$'`
这很好用,但您需要在当前文件夹或其子文件夹之一中至少有一个 *.php
文件,否则 wc
会停止。
至少在 OS X 上,其他一些答案中列出的 find+xarg+wc 命令在大型列表中多次打印“total”,并且没有给出完整的总数。我能够使用以下命令获得 .c 文件的单个总数:
find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'
grep total
而不是 grep -v total
- 它将对 wc
给出的中间和求和。重新计算中间和没有意义,因为 wc
已经这样做了。
如果文件太多,最好只查找总行数。
find . -name '*.php' | xargs wc -l | grep -i ' total' | awk '{print $1}'
如果您只需要总行数,比方说,您的 PHP 文件,如果您安装了 GnuWin32,即使在 Windows 下也可以使用非常简单的一行命令。像这样:
cat `/gnuwin32/bin/find.exe . -name *.php` | wc -l
您需要指定 find.exe 的确切位置,否则将执行 Windows 提供的 FIND.EXE(来自旧的类似 DOS 的命令),因为它可能在环境 PATH 中的 GnuWin32 之前,并且具有不同的参数和结果。
请注意,在上面的命令中,您应该使用反引号,而不是单引号。
虽然我喜欢这些脚本,但我更喜欢这个脚本,因为它还显示每个文件的摘要,只要总数:
wc -l `find . -name "*.php"`
不定期副业成功案例分享
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
将运行多次。也不处理许多特殊文件名。find . -name "*.php" -not -path "./tests*" | xargs wc -l