我需要 chmod 某个组中的文件。我想出了这个结构:
find . -group groupname -exec sh -c 'su -c "chmod -R u+w,g-w,o-w,g+r,o+r ." - groupname {}' \;
这可以工作,但当文件名中包含括号(或)时会失败。
有任何想法吗?
答案1
您使用插值的方式{}
使文件名不带引号,因此它有点像 running chmod u=rw some(filename).txt
,这会按照您所描述的方式失败。
一种解决方案是将{}
移出带引号的字符串,以便它find
本身可以正确处理它。
另一个问题是您似乎正在分割chmod
命令,其中一部分在内部su
,一部分在外部。 (通过替换sh
为来演示这一点echo
。)结果是一个损坏的命令,我不完全确定你想要实现什么。
试试这个(echo
当你确定它正在做你想要的事情时删除):
su -c "
find . -group groupname -exec echo chmod -R u+w,go+r,go-w {} \;
"
chmod
您真的打算对每个恰好有 group 的目录应用递归吗groupname
?也许您应该-type d
在谓词集中考虑。
答案2
您必须将IFS
变量设置为$(echo -en "\n\b")
,例如:
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
find . -group groupname -exec sh -c 'su -c "chmod -R u+w,g-w,o-w,g+r,o+r ." - groupname {}' \;
IFS=$SAVEIFS