"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
之后的命令的参数列表中,而不是 {}
。在达到参数长度之前,命令是 运行,其余找到的文件将在命令的新 运行 中以相同的方式处理,直到完成整个列表。
有关详细信息,请参阅 find
的 man page。
感谢 Charles Duffy 改进此答案。
我在一个目录下有大约 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
之后的命令的参数列表中,而不是 {}
。在达到参数长度之前,命令是 运行,其余找到的文件将在命令的新 运行 中以相同的方式处理,直到完成整个列表。
有关详细信息,请参阅 find
的 man page。
感谢 Charles Duffy 改进此答案。