linux 中可通过 getfacl -r 与 setfacl --restore 配合迁移目录 acl:先递归导出源目录 acl 并替换路径前缀,再用 --restore 应用至目标目录,需确保目标结构一致、文件系统支持 acl 且用户权限充足。

Linux 中不能直接用一条命令“复制 ACL”,但可以通过 getfacl 和 setfacl 配合实现目录 ACL 权限的完整迁移。
获取源目录的完整 ACL 规则
使用 getfacl -R 递归导出源目录所有文件和子目录的 ACL,保存为临时文件:
getfacl -R /path/to/source > acl_backup.acl
注意:-R 会包含所有嵌套项的绝对路径。若目标目录路径不同,需先替换路径前缀(见下一步)。
适配目标路径(关键步骤)
ACL 文件中记录的是绝对路径,直接应用会失败。需将源路径前缀替换成目标路径:
sed -i 's|^# file: /path/to/source|# file: /path/to/destination|' acl_backup.acl
如果子目录层级深或路径含特殊字符,建议用 perl 或 awk 更稳妥地批量替换;也可用 getfacl -R --omit-header 配合脚本逐条处理,避免路径硬编码问题。
将 ACL 应用到目标目录
确保目标目录已存在(包括完整目录结构),然后用 setfacl --restore 批量还原:
setfacl --restore=acl_backup.acl
该命令会严格按 ACL 文件中的路径和权限设置每项,包括默认 ACL(default: 行)——这对新创建的子文件/目录生效至关重要。
验证与注意事项
- 执行前确认目标目录结构与源目录一致(可用
rsync -n -r --delete模拟检查) - 目标文件系统必须支持 ACL(如 ext4、xfs),且挂载时启用
acl选项(多数现代发行版默认开启) - 运行
setfacl的用户需对目标路径有写权限及sudo权限(若涉及 root-owned 文件) - 验证:用
getfacl /path/to/destination查看根目录 ACL,再抽查几个子项是否匹配











