/ usr / bin / find参数列表太长

时间:2015-02-25 19:33:25

标签: linux shell find redhat xargs

尝试使用命令行中的以下内容搜索从list.txt中排除的所有文件

find . -type f -name "*.ext" $(printf "! -name %s " $(cat list.txt))

我得到以下结果

-bash: /usr/bin/find: Argument list too long

我也试过xargs但不确定我是否正确使用它。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

我会去grep

find -type f -name '*.ext' | grep -vFf list.txt

传递-f grep时,从文件中读取搜索模式。 -v否定了搜索。通常grep将搜索模式视为正则表达式。如果您-F grep将这些视为固定字符串。

答案 1 :(得分:0)

你能试试吗?

  找到。 -type f -name" * .ext" -exec grep -v" ^ {} $" list.txt&& echo {}   \;

答案 2 :(得分:0)

您并不完全清楚自己的目标是什么,所以这些言论有点普遍。

例如,如果您想为单词foo grep大量文件,那么您可以执行类似

的操作
find . -type f -name \*.ext | xargs grep foo

重要的是,\*会传递给find以便展开,而且不会展开。 '参数列表太长'错误可能是 shell 扩展您的"*.ext"并尝试将该长列表作为一堆参数进行查找的结果。这可能是您在此实验中遗漏的关键因素。

xargs的工作方式是它从stdin读取参数(在本例中是find生成的文件列表),并使用尽可能多的参数重复调用给定的函数会合适。如果发送到xargs的字符串完全异常,您应该查看-0的{​​{1}}选项。

使用find的另一种方法是

,这在某些情况下更自然
xargs

在这里,find . -type f <whatever> | while read f; do some-command $f; done 再次逐行读取一行,然后将它们依次分配给while,在循环中一次处理一行。