尝试使用命令行中的以下内容搜索从list.txt中排除的所有文件
find . -type f -name "*.ext" $(printf "! -name %s " $(cat list.txt))
我得到以下结果
-bash: /usr/bin/find: Argument list too long
我也试过xargs但不确定我是否正确使用它。任何帮助将不胜感激。
答案 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
,在循环中一次处理一行。