/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
,在循环中一次处理一个。
尝试使用以下命令行
搜索从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
,在循环中一次处理一个。