使用find
扫描目录树,wc
将完成剩下的工作
$ find path -type f | xargs wc -w | tail -1
Run Code Online (Sandbox Code Playgroud)
最后一行给出总数.
tldr;
$ find . -type f -exec wc -w {} + | awk '/total/{print $1}' | paste -sd+ | bc
Run Code Online (Sandbox Code Playgroud)
解释:
在find . -type f -exec wc -w {} +
将运行wc -w
上的所有文件(递归)包含由.
(当前工作目录)。find
将执行wc
尽可能少的次数,但根据需要执行尽可能多的次数以符合ARG_MAX
--- 系统命令长度限制。当文件的数量(和/或它们的组成长度)超过 时ARG_MAX
,find
调用wc -w
不止一次,给出多total
行:
$ find . -type f -exec wc -w {} + | awk '/total/{print $0}'
8264577 total
654892 total
1109527 total
149522 total
174922 total
181897 total
1229726 total
2305504 total
1196390 total
5509702 total
9886665 total
Run Code Online (Sandbox Code Playgroud)
通过仅打印每total
行的第一个以空格分隔的字段来隔离这些部分和:
$ find . -type f -exec wc -w {} + | awk '/total/{print $1}'
8264577
654892
1109527
149522
174922
181897
1229726
2305504
1196390
5509702
9886665
Run Code Online (Sandbox Code Playgroud)
paste
带有+
分隔符的部分总和给出中缀总和:
$ find . -type f -exec wc -w {} + | awk '/total/{print $1}' | paste -sd+
8264577+654892+1109527+149522+174922+181897+1229726+2305504+1196390+5509702+9886665
Run Code Online (Sandbox Code Playgroud)
使用 评估中缀bc
和,它支持中缀表达式和任意精度:
$ find . -type f -exec wc -w {} + | awk '/total/{print $1}' | paste -sd+ | bc
30663324
Run Code Online (Sandbox Code Playgroud)
参考:
您可以找到并打印所有内容并通过管道传输到wc
:
find path -type f -exec cat {} \; -exec echo \; | wc -w
Run Code Online (Sandbox Code Playgroud)
注意:-exec echo \;
如果文件不以换行符结尾,则需要 ,在这种情况下,一个文件的最后一个单词和下一个文件的第一个单词将不会分开。
或者您可以找到 andwc
并使用 awk 来聚合计数:
find . -type f -exec wc -w {} \; | awk '{ sum += $1 } END { print sum }'
Run Code Online (Sandbox Code Playgroud)