用 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
我正在尝试 运行 对一堆文件执行命令:
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