使用 find /path -type f -exec setfacl -b {} \; 可批量清除文件的所有扩展acl条目,-b选项移除所有扩展acl但保留基础权限,不改动内容、属主、属组及时间戳。

Linux 中批量清理文件的 ACL(Access Control List)属性,核心思路是:先用 find 精准定位设置了 ACL 的文件,再通过 setfacl 命令统一移除。ACL 属于扩展权限,不会被 chmod 影响,必须用专门工具处理。
确认哪些文件有 ACL 属性
ACL 存在时,ls -l 输出中权限字段末尾会多一个 + 符号(如 -rw-r--r--+ 1 user group 123 Jan 1 file.txt)。但靠肉眼排查效率低,应让 find 自动识别:
-
find /path/to/dir -type f -exec ls -l {} \; | grep ' +$'—— 辅助验证,不推荐用于批量操作 - 更可靠的方式是直接用
getfacl检测输出长度:find /path/to/dir -type f -exec getfacl {} \; 2>/dev/null | grep -l "^# file:" | cut -d: -f3-
用 find + setfacl 批量清除 ACL
setfacl -b 是清除单个文件所有 ACL 条目的标准命令(-b 表示 “remove all”)。结合 find 可实现批量清除:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 安全执行(先预览):
find /var/log -type f -name "*.log" -exec getfacl {} \; 2>/dev/null | grep -A 1 "^# file:" - 真正清除(慎用!建议先备份或测试小范围):
find /var/log -type f -name "*.log" -exec setfacl -b {} \; - 若需排除某些目录(如避免触碰 NFS 挂载点),可加
-xdev:find /home -xdev -type f -exec setfacl -b {} \;
为什么不能只靠 chmod 或 chown?
ACL 是独立于传统 rwx 和属主/属组的权限层。即使你用 chmod 644 修改了基础权限,原有 ACL 条目(如 user:jane:rwx)依然存在,且优先级更高。只有 setfacl -b 或 setfacl -k(仅删默认 ACL)能真正剥离它。
注意事项与避坑点
ACL 清理不是“删除文件”,而是重置其扩展权限。但仍需注意:
- 确保目标文件系统支持 ACL(ext4、xfs 默认开启;某些挂载选项如
noacl会禁用) -
setfacl -b不影响文件内容、时间戳、属主属组和基础权限 - 对目录使用
-b会同时清除其默认 ACL(default ACL),后续新建文件将不再继承该 ACL - 若只想清除特定用户/组的 ACL 条目,可用
setfacl -x u:username,g:groupname,配合find同样适用










