"Argument list too long" 将查找输出作为参数传递时出错

"Argument list too long" error when passing a find output as arguments

我在一个目录下有大约 500 万个文本文件 - 所有格式都相同(没什么特别的,只是每行有一些整数的纯文本文件)。我想计算所有这些文件中的最大和最小行数,以及它的两个文件名(一个用于最大,另一个用于最小)。

我开始尝试像这样写出所有行数(然后练习如何从此列表中找到最小值和最大值):

wc -l `find /some/data/dir/with/text/files/ -type f` > report.txt

但这会给我一个错误:

bash: /usr/bin/wc: Argument list too long

也许有更好的方法来解决这个问题?

参数列表长度有 limit。由于您有数百万个文件传递给 wc,因此该命令肯定会越过此行。

最好改为调用 find -exec COMMAND

find /some/data/dir/with/text/files/ -type f -exec wc -l {} + > report.txt

在这里,每个找到的文件 find 将被附加到 -exec 之后的命令的参数列表中,而不是 {}。在达到参数长度之前,命令是 运行,其余找到的文件将在命令的新 运行 中以相同的方式处理,直到完成整个列表。

有关详细信息,请参阅 findman page


感谢 Charles Duffy 改进此答案。