我在想,如果有递归选项,我可以用 wc 以某种方式做到这一点,但我不确定。我想要一个目录及其子目录下的文件的总字数(而不仅仅是每个文件的字数)。
请注意,我是用我的 Mac 执行此操作的。
好的,我刚刚尝试了这个命令
find enwiki/ -type f | xargs wc -w > output.txt
生成的输出文件有 6425104 行,说明文件很多。但最终的总字数只有 381609。是不是计算出来的字数超过了 bash 允许的最大值?我不确定是不是这样,还是我错误地使用了 wc。
答案1
使用find
查找所有文件,然后将它们连接起来,cat
并计算连接流中的单词数wc
:
find . -type f -exec cat {} + | wc -w
您的命令的问题在于,wc
如果您要处理数千个文件,则会对文件批次多次调用 。在上面的命令中,cat
会对文件批次多次调用 ,但所有输出都会发送到 的单次调用wc
。
答案2
如果你wc
有--files0-from
选择,你可以这样做:
find . -type f -print0 | wc -w --files0-from=-
解释:
我首先阅读了 wc(1) 手册页,查看了哪些选项可用于扫描多个文件,从而找到了此解决方案。我发现了以下内容:
--files0-from=F
read input from the files specified by NUL-terminated names in file F;
If F is - then read names from standard input
通过以前的使用find
,我知道它可以生成所需的文件列表,并使用选项-print0
将文件输出为以 NULL 结尾的名称列表。
将这些放在一起得到上面的命令。该find
命令在当前目录 ( .
) 和所有子目录中搜索常规文件 ( -type f
),并将其完整路径名打印到标准输出,每个名称后跟一个空字符,而不是通常的换行符 ( -print0
)。该结果通过管道 ( |
) 传输到标准输入,标准输入wc
从指定文件 ( --files0-from=
) 读取该列表,其中-
表示标准输入,并打印在每个文件中找到的单词数 ( -w
),后跟找到的所有单词的总数。
如果您感兴趣的只是总数,您可以将其附加到上面的命令中。
| tail -1
答案3
尝试:
$ find . -type f -exec wc -w {} \; -print | nawk -f sum -
其中 sum 是下面两行给出的 nawk/gawk/awk 程序文件,该文件对管道符号左侧的命令(即“|”)输出的每一行执行:
{ s += $1 }
END { print "word sum = ", s }
注意:文件的权限很重要,因此可能会得到权限被拒绝的输出,否则,发出上述 find 命令的用户所拥有的所有文件都应通过管道传输到 nawk(或 gawk 或 awk)命令中,从而给出您要查找的输出,但不包括用户没有读取权限的任何文件。