stat -c "%f" 输出文件内核 st_mode 的十六进制值(如81ed),高4位表示文件类型(如8000为普通文件),低12位对应八进制权限(如1ed→755);符号链接默认显示自身mode,加-L才查目标文件。

直接用 stat -c "%f" 文件名 就能输出文件在内核中存储的原始权限模式(mode bits)的十六进制值,它包含文件类型和访问权限两部分,共4位十六进制数字。
理解 %f 输出的含义
%f 显示的是内核 st_mode 字段的原始值,以小写十六进制表示(如 81ed、41ed)。这个值不是单纯“权限”,而是组合了:
- 高4位(最左1位或2位):文件类型标志(如
8000表示普通文件,4000表示目录,a000表示符号链接) - 低12位(右3位):传统 Unix 权限位(
rwxr-xr-x对应八进制755→ 十六进制1ed)
例如:81ed 拆解为 8000(普通文件) + 1ed(即八进制 755),合起来就是 -rwxr-xr-x。
常用对比方式:同时看 %f 和 %A/%a
单看 %f 不够直观,建议搭配可读格式一起输出,便于验证:
stat -c "mode(hex): %f | type+perm: %A | octal: %a" myfile.txt
输出类似:
mode(hex): 81b6 | type+perm: -rw-rw-r-- | octal: 664
这里 81b6 中的 8000 是文件类型,1b6 转八进制正好是 664(因为 1b6₁₆ = 438₁₀ = 664₈)。
注意符号链接的默认行为
默认情况下,stat -c "%f" linkname 显示的是**符号链接自身**的 mode(通常是 a1ff 或 a1ed,a000 表示链接类型),不是它指向的目标文件。若要查目标文件的 mode,加 -L:
-
stat -c "%f" mylink→ 链接本身的 mode -
stat -L -c "%f" mylink→ 链接所指文件的 mode
扩展:快速转换十六进制 mode 到八进制权限
只需取 %f 的后三位(忽略高位类型码),用计算器或 shell 命令转:
# 提取后3字符并转八进制(bash/zsh) printf "%o\n" $((0x$(stat -c "%f" file | tail -c 4)))
或者更稳妥地只取低12位(掩码 & 0xfff):
printf "%o\n" $((0x$(stat -c "%f" file) & 0xfff))
这样就能准确还原内核视角下的权限位构成,对调试 ACL、安全上下文或底层文件操作很有帮助。


















