我试图在一堆文件上运行命令:
find . -name "*.ext" | xargs -0 cmd
上面的工作但它挂了,因为其中一个文件夹愚蠢地有一个'在文件名中(其他人有parens和其他废话)。
如何安全地将转义输出发送到我的命令? e.g:
cmd foo\ bar\(baz\)\'\!
[edit]我知道我可以运行find ... -exec cmd {} \;
但是我正在运行的实际命令更复杂,并且首先通过sed
传送
答案 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