我需要设置所有者的相同权限以递归地对目录中的所有元素进行分组。
答案1
有一个相当简单的答案(尽管我不确定它是否适用于 *nix 的所有版本);简单地做
chmod g=u *
即,设置G组权限等于你服务权限。
这记录在修改(1):
符号模式的格式为 [
ugoa
...][[+-=
][烫发...]...], 在哪里烫发是集合中的零个或多个字母rwxXst
,或集合中的单个字母ugo
。 ……︙
这些信
rwxXst
选择 …。您可以精确指定其中一个字母,而不是其中一个或多个字母ugo
:授予拥有该文件的用户的权限(u
),授予属于该文件组的其他用户的权限(g
),以及授予不属于上述两个类别的用户的权限(o
)。
答案2
在(最近的sed
)-z
GNU 系统上,您可以执行以下操作:
find . ! -type l -printf '%m:%p\0' |
sed -Ez '/^.?(.)\1.:/d;s/(.)(.)(.):/\1\1\2\x0/' |
xargs -r0n2 echo chmod
echo
(对结果满意后删除)。
请注意,它仅寻址r
, w
,x
位,而不是特殊位。
如果你不希望它递归:
find . -mindepth 1 -maxdepth 1 ! -type l -printf '%m:%p\0' |
sed -Ez '/^.?(.)\1.:/d;s/(.)(.)(.):/\1\1\2\x0/' |
xargs -r0n2 echo chmod
答案3
尝试这个:
for file in $(find .); do
perm=$(stat -c "%a" ${file});
echo chmod ${perm:0:1}${perm:0:1}${perm:2:1} ${file};
done
记得删除echo
。
改良版:
find . -exec sh -c 'for file do
perm=$(stat -Lc "%a" "$file")
echo chmod "${perm:0:1}${perm:0:1}${perm:2:1}" "$file"
done' sh {} +
如在斯特凡·查泽拉斯的回答,
- 使用
-mindepth 1
时避免加工.
。 - 用于
-maxdepth 1
避免递归(进入子目录)。 - 用于
! -type l
避免处理符号链接(尽管此答案可以正常处理符号链接)。
请注意,对于设置了任何高阶模式位(setuid、setgid 和 Sticky)的文件,此命令将无法正常工作。