在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 `('
有人能帮忙吗?提前谢谢。
答案 0 :(得分:0)
尝试以下方法:
find /path -exec sh -c 'chmod -N "$@"; xattr -c "$@"' - {} +
-exec ... +
,将所有匹配路径传递给指定命令,这是最有效的方法。
chmod
和xattr
都支持多个文件操作数,因此这种方法是可行的。
find
在通过替换{}
的路径时正确保留参数边界,因此它甚至可以正确处理带有嵌入换行符的文件名。
顺便说一下:我不清楚代码中tr '\n', '\0'
的用途是什么,因为您已经输出了\0
- 由-print0
分隔的路径。
请注意-
作为传递给sh -c
的第一个(虚拟)参数,因为第一个参数将变为$0
。
至于原始命令的问题:
我无法解释具体的症状,但有一个问题是你没有引用shell命令中的{}
个实例,这会使它们受到分词的影响(打破文件路径嵌入空间到多个参数中。)