用 %a 是因为其输出纯数字权限码(如644),直接来自inode元数据,稳定无歧义,比ls更可靠,尤其在acl或特殊权限场景下。

直接用 stat -c "%a" 提取八进制权限数字,这是脚本校验最常用、最可靠的方式。
为什么用 %a 而不是 ls 或其他方式
%a 输出纯数字(如 644、755),不含空格、符号或多余字段,适合直接参与 shell 条件判断。它来自 inode 元数据,不经过解析或推算,比 ls -l 的字符串更稳定、无歧义——尤其当文件带 ACL 或特殊权限时,ls 可能显示不全,而 %a 始终反映真实权限值。
基础用法与常见校验写法
- 单个文件检查:
if [ "$(stat -c "%a" /path/to/file)" = "644" ]; then echo "OK"; fi - 目录是否为 755:
[ "$(stat -c "%a" /var/www/html)" = "755" ] && echo "目录可访问" - 批量过滤不合规项:
find /opt/app -type f -exec stat -c "%a %n" {} \; | awk '$1 != 644 {print $0}'
注意路径存在性和类型区分
stat -c "%a" 不检查路径是否存在,也不区分文件还是目录——它只读取已存在的目标的权限字段。所以脚本中建议先做存在性判断:
[ -e "/target" ] || { echo "路径不存在"; exit 1; }- 若需按类型差异化校验(如目录必须有执行位),可配合
-d或-f判断:if [ -d "/target" ] && [ "$(stat -c "%a" "/target")" != "755" ]; then ...
兼容性小提示
GNU 系统(主流 Linux)支持 -c;部分 BSD 或旧系统需改用 --format,或用 stat -f "%Lp" file(macOS/BSD 风格)。生产脚本建议加简单探测逻辑,避免硬编码选项。











