用 xargs 转义撇号?

Escaping an apostrophe with xargs?

我正在尝试 运行 对一堆文件执行命令:

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

以上有效但挂起,因为其中一个文件夹的文件名中愚蠢地有一个 '(其他文件夹有括号和其他废话)。

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

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

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

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

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

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

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

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

您可以使用此 while 循环来处理使用 process substitution:

使用 NUL 终止符的 find 命令的结果
while IFS= read -rd '' file; do
   # echo "$file"
   cmd
done < <(find -iname "*.ext" -print0)

这可以处理包含各种空格、全局字符、换行符或任何其他特殊字符的文件名。

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

GNU Parallel 的诞生正是因为 xargs 处理 ", ' 和 space:

的方式
find . -name "*.ext" | parallel cmd