setfacl -R 递归设 ACL 前需确认文件系统挂载时启用 acl 选项,设后需检查并可能手动调整 mask 权限,-d 与 -R 需分步设置,默认不处理符号链接,需用 -L 或 -P 显式指定。

用 setfacl -R 可以递归设置目录及其所有子目录、文件的 ACL 权限,但直接敲命令往往不生效——关键不在“怎么设”,而在“设之前确认什么”和“设之后是否真起作用”。
必须先确认文件系统支持 ACL
如果挂载时没启用 acl 选项,setfacl -R 会静默成功,但权限实际无效。
- 检查挂载点是否启用:运行
mount | grep " /your/mount/point ",输出中必须含acl - 临时启用(需 root):
sudo mount -o remount,acl /mount/point - 永久生效:编辑
/etc/fstab,在对应行的挂载选项里加,acl,例如:
/dev/sdb1 /data ext4 defaults,acl 0 2
递归设置后 mask 可能锁住你的权限
ACL 中的 mask 是一道隐形闸门:非属主、非属组的用户/组条目,实际生效权限 = 条目权限 & mask 权限。执行 setfacl -Rm 后,mask 会自动重算为当前所有条目中的最大权限(不含属主/属组),常导致你设的 rw 被降为 r。
- 查当前 mask:
getfacl /dir | grep "mask::" - 强制放开 mask:
setfacl -Rm u:alice:rw --mask /dir或显式设定:setfacl -Rm m::rwx /dir - 跳过自动重算(需自己确保 mask 足够):
setfacl -Rn -m u:alice:rw /dir
默认 ACL(-d)和递归 ACL(-R)要分开处理
setfacl -d 只影响未来新建的文件/子目录;setfacl -R 只影响当前已存在的内容。两者不互替,协作场景下通常都要设。
- 让已有全部内容获得权限:
setfacl -Rm u:alice:rwx /shared - 让后续新建文件自动继承该权限:
setfacl -dm u:alice:rwx /shared - 不能合并成一条命令,必须分两步执行
符号链接行为需明确指定
setfacl -R 默认不进入符号链接指向的目录,只修改链接文件自身的 ACL —— 这往往不是你想要的。
- 例如:
ln -s /real/data mylink,执行setfacl -Rm u:carol:r mylink实际改的是mylink这个链接文件的权限 - 如需跟随链接进入目标目录,加
-L:setfacl -RLm u:carol:r mylink - 如需完全跳过所有符号链接(包括文件和目录),加
-P


















