使用 setfacl -r 递归设置 acl 前须确认文件系统启用 acl 挂载选项、mask 权限未限制实际生效、默认 acl 需单独用 -d 设置、符号链接需明确指定 -l 或 -p,否则权限可能不生效或误设。

用 setfacl -R 可以递归设置现有子目录和文件的 ACL 权限,但直接敲命令往往不生效——问题通常出在前提条件或权限逻辑上,而不是语法本身。
确认文件系统已启用 ACL 支持
如果挂载时没开启 acl 选项,setfacl -R 会静默成功,但权限实际无效:
- 检查是否启用:运行
mount | grep " /your/mount/point ",输出中必须含acl - 临时启用:执行
sudo mount -o remount,acl /mount/point - 永久生效:编辑
/etc/fstab,在对应挂载行的选项里加,acl,例如:/dev/sdb1 /data ext4 defaults,acl 0 2
注意 mask 对实际权限的限制
ACL 中的 mask 是一道隐形闸门:非属主/非属组的用户或组条目,其真实生效权限 = 设置权限 & mask 权限。递归设置后,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 需单独设置,不随 -R 自动生效
-R 只作用于**当前已存在**的目录和文件;而新创建的内容要自动继承权限,必须额外设置默认 ACL(-d):
- 给已有全部内容赋权:
setfacl -Rm u:alice:rwx /shared - 让后续新建项自动继承:
setfacl -dm u:alice:rwx /shared - 两者不可合并为一条命令,必须分两步执行
符号链接行为要明确指定
setfacl -R 默认不进入符号链接指向的目录,只修改链接文件自身的 ACL —— 这容易误操作:
- 若链接指向目标目录且你想递归设置其内容,加
-L:setfacl -RLm u:carol:r /path/to/symlink - 若想完全跳过所有符号链接(包括文件和目录),加
-P











