用xargs逃避撇号?

时间:2018-03-18 04:48:04

标签: macos shell xargs

我试图在一堆文件上运行命令:

find . -name "*.ext" | xargs -0 cmd

上面的工作但它挂了,因为其中一个文件夹愚蠢地有一个'在文件名中(其他人有parens和其他废话)。

如何安全地将转义输出发送到我的命令? e.g:

cmd foo\ bar\(baz\)\'\!

[edit]我知道我可以运行find ... -exec cmd {} \;但是我正在运行的实际命令更复杂,并且首先通过sed传送

3 个答案:

答案 0 :(得分:2)

您可以使用此while循环来处理使用process substitution使用find终止符的NUL命令的结果:

while IFS= read -rd '' file; do
   # echo "$file"
   cmd
done < <(find -iname "*.ext" -print0)

这可以处理包含所有类型的空格,glob字符,换行符或任何其他特殊字符的文件名。

请注意,这需要bash,因为bourne shell不支持进程替换。

答案 1 :(得分:1)

如果你有GNU find,你可以使用-print0选项

find -name "*.ext" -print0 | xargs -0 cmd

否则你将不得不放弃xargs。如果你有Bash,你可以使用

find -name "*.ext" | while read -a list ; do cmd "${list[@]}" ; done

请注意,您不必指定当前目录作为起点。如果未指定开始,则假定为.

答案 2 :(得分:0)

GNU Parallel的诞生恰恰是因为xargs处理&#34;的方式,&#39;和空间:

find . -name "*.ext" | parallel cmd