如何递归计算目录中的单词数?

Ali*_*ing 6 vim bash grep count cpu-word

我正在尝试计算项目中写的字数.文件夹中有几个级别,其中包含大量文本文件.

任何人都可以帮我找到一个快速的方法来做到这一点?

bash或vim会很好!

谢谢

kar*_*kfa 8

使用find扫描目录树,wc将完成剩下的工作

$ find path -type f | xargs wc -w | tail -1
Run Code Online (Sandbox Code Playgroud)

最后一行给出总数.


rub*_*cks 5

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_MAXfind调用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)

参考:


Sto*_*ica 4

您可以找到并打印所有内容并通过管道传输到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)