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


3

我想我可以用wc以某种方式做到这一点,如果有一个递归选项但我不确定。我想要一个目录及其子目录下的文件中的总字数总数(不仅仅是每个文件的字数)。

注意我用我的mac执行此操作。

好的,我刚试过这个命令

find enwiki/ -type f | xargs wc -w > output.txt

生成的输出文件有6425104行,表示有很多文件。但最终的总字数只有381609.或许,计算的字总数超过了bash允许的最大值?我不确定是否发生了这种情况,或者我是否错误地使用了wc。

Answers:


11

利用find找到的所有文件,然后用它们串联cat和级联流与计算的话wc

find . -type f -print0 | xargs -0 cat | wc -w

-print0给的说法find,如果你在你的文件的名称空间是必要的。当-print0被使用find,该-0标志必须搭配使用xargs


4
您应该注意,如果所有文件都不是文本文件,这将给您意想不到的结果。如果目录树中有其他类型的文件,“find.-type f -name \ * .txt -print0”可能会更好。
2011年

3

如果您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)。该结果是piped(|)到标准输入中wc,从指定的文件(--files0-from=)中读取该列表,其中-表示标准输入,并打印-w在每个文件中找到的单词数(),后跟找到的所有单词的总数。

如果你感兴趣的是总数,你可以将它附加到上面的命令。

| tail -1

你能提供一些关于你的代码的解释吗?
Tamara Wijsman

显然,对于较大的文件,这是最简单,也是最有效的解决方案。
迈克尔

0

尝试:

$ find . -type f -exec wc -w {} \; -print | nawk -f sum -

其中sum是由下面两行给出的nawk / gawk / awk程序文件,它对管道符号左侧命令的每一行输出执行 - 即'|':

{ s += $1 }
END { print "word sum = ", s }

注意:文件的权限很重要,因此可以获得Permission denied输出,否则,发出上述find命令的用户拥有的所有文件通过管道输入到nawk(或gawk或awk)命令应该会给你正在寻求的输出更少用户没有读取权限的任何文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.