如何计算目录(及其子目录)中所有文件的总字数?

如何计算目录(及其子目录)中所有文件的总字数?

我在想,如果有递归选项,我可以用 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)命令中,从而给出您要查找的输出,但不包括用户没有读取权限的任何文件。

相关内容