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

/usr/bin/find Argument list too long

尝试使用以下命令行

搜索从list.txt中排除的所有文件
find . -type f -name "*.ext" $(printf "! -name %s " $(cat list.txt))

我得到以下结果

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

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

我会通过管道传送到 grep:

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

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

你能试试这个吗?

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

还不完全清楚你打算用你的命令做什么,所以这些评论有点笼统。

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

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

这里重要的是 \* 被传递给 find 来展开, 而不是 被 [=40 展开=]. 'Argument list too long' 错误可能是 shell 扩展您的 "*.ext" 并试图将该长列表作为要查找的一堆参数传递的结果。这可能是您在此处的实验中遗漏的关键内容。

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

在某些情况下更自然的另一种使用查找的方法是

find . -type f <whatever> | while read f; do some-command $f; done

这里,while再次一次读取一行,将它们依次分配给f,在循环中一次处理一个。