当使用chmod
(在我的例子中是coreutils
8.12 的一部分)并递归设置该x
位时,存在方便的X
(大写字母 x),仅在目录上设置该位。因此,如果您想x
从所有文件中删除 并仅将其保留在文件夹中,您可以将其压缩到单个调用中,如下所示:
chmod -R a-x,a+X /path/to/folder
如果您的同事的 unixoid 系统概念起源于 20 世纪 80 年代,并且755
他们只知道八进制,那么这一点尤其有用。
s
然而,尽管文件和文件夹中的位含义存在类似的二元性,但我还没有找到这样的东西。我指的是chmod(1)
,特别是setgid
行为。所以如果我这样做:
chmod -R g+ws /path/to/folder
我最终得到了文件和文件夹类似地设置了位,而我想要的只是在文件夹上设置它,以便在那里创建的文件始终自动归所属组所有。
有没有一种方便的方法,缺少:
find /path/to/folder -type d -exec chmod g+s {} \;
???
答案1
当您使用-R
开关 to时chmod
,您是说您希望将相关权限更改递归地应用于文件和文件夹。
没有办法告诉chmod
您只将这些设置应用于其中一个,因此您唯一的办法就是寻求工具的帮助,例如find
构建目录列表,然后有选择地针对此列表执行命令exec
。chmod
chmod
您可以通过exec
像这样使用命令+
的变体来调用它来提高效率exec
:
$ find /path/to/folder -type d -exec chmod g+s {} +
答案2
独自一人是没有办法做到这一点的chmod
。在 zsh 中,您可以利用递归 globbing 和 glob 限定符:
chmod g+ws /path/to/folder/**/*(/)
在 ksh 中,您可以执行此操作,但它也会对目录的符号链接进行操作。
set -o globstar
chmod g+ws /path/to/folder/**/*/
在 bash 中,您可以执行此操作,但它还会在递归下降期间遍历目录的符号链接。
shopt -s globstar
chmod g+ws /path/to/folder/**/*/
您可以在目录上使用默认 ACL 来使文件可由组写入,而不是在目录上使用 setgid 位。
setfacl -d -m g:somegroup:rwx /path/to/folder/**/*(/)
setfacl -m g:somegroup:rwx /path/to/folder/**/*(/)