使用find和xargs的多个命令,也考虑了特殊字符

时间:2015-06-07 13:24:02

标签: bash find xargs

在OS X中,我尝试将以下两个命令组合到bash脚本中的单个命令中,以便find仅运行一次。 find使用的文件包含空格和特殊字符。

命令1:

find /path -print0 | tr '\n' '\0' | xargs -0 chmod -N

命令2:

find /path -print0 | tr '\n' '\0' | xargs -0 xattr -c

以上两个命令都有效。

我从“Make xargs execute the command once for each line of input”了解到,可以通过xargs执行多个命令,例如

find /path -print0 | xargs -0 -I '{}' sh -c 'command1 {} ; command2 {}'

但是,我尝试将命令与

组合在一起
find /path -print0 | tr '\n' '\0' | xargs -0 -I '{}' sh -c 'chmod -N {} ; xattr -c {}'

会导致/path中的每个文件和文件夹出现多个错误,例如

chmod: Failed to clear ACL on file {}: No such file or directory
xattr: No such file: {}
sh: -c: line 0: syntax error near unexpected token `('

有人能帮忙吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

find /path -exec sh -c 'chmod -N "$@"; xattr -c "$@"' - {} +
  • -exec ... +,将所有匹配路径传递给指定命令,这是最有效的方法。

    • chmodxattr都支持多个文件操作数,因此这种方法是可行的。

    • find在通过替换{}的路径时正确保留参数边界,因此它甚至可以正确处理带有嵌入换行符的文件名。
      顺便说一下:我不清楚代码中tr '\n', '\0'的用途是什么,因为您已经输出了\0 - 由-print0分隔的路径。

  • 请注意-作为传递给sh -c的第一个(虚拟)参数,因为第一个参数将变为$0

至于原始命令的问题:

我无法解释具体的症状,但有一个问题是你没有引用shell命令中的{}个实例,这会使它们受到分词的影响(打破文件路径嵌入空间到多个参数中。)