统计输出中的“十六进制原始模式”是什么?

And*_*rew 7 permissions stat

当使用 GNUstat探测文件系统时,有许多格式序列可用于--format/--printf参数;特别是这个

%f    Raw mode in hex
Run Code Online (Sandbox Code Playgroud)

没有多大意义。与 %a 访问模式相比,某些内容可能(您可以用 看到stat --format '%f %a')原始模式为 41ed,但访问模式为 755,或者原始模式为 81a4,访问模式为 644。

那么“原始模式”是什么意思?

And*_*rew 10

破译“十六进制原始模式”的含义有两个部分;第一个是它在hex,但访问模式通常用八进制描述:

41ed 16 = 40775 8 
81a4 16 = 100644 8

如果您查看/tmp,它通常设置了受限删除标志(“粘滞位”):

$ ls -ld /tmp
drwxrwxrwt 17 根 4096 2012-05-31 13:45 /tmp
$ stat --format '%f %a' /tmp
第 43 章 1777

并转换:

43ff 16 = 41777 8

stat 函数 ( man 2 stat)的程序员手册中描述了“十六进制原始模式” ,注意它们是八进制值:

为 st_mode 字段定义了以下标志:

S_IFMT 0170000 文件类型位字段的位掩码
S_IFSOCK 0140000 套接字
S_IFLNK 0120000 符号链接
S_IFREG 0100000 常规文件
S_IFBLK 0060000 块设备
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符设备
S_IFIFO 0010000 先进先出
S_ISUID 0004000 设置 UID 位
S_ISGID 0002000 设置组 ID 位(见下文)
S_ISVTX 0001000 粘滞位(见下文)
S_IRWXU 00700 文件所有者权限掩码
S_IRUSR 00400 所有者有读权限
S_IWUSR 00200 所有者有写权限
S_IXUSR 00100 所有者有执行权限
S_IRWXG 00070 组权限掩码
S_IRGRP 00040 组有读权限
S_IWGRP 00020 组有写权限
S_IXGRP 00010 组有执行权限
S_IRWXO 00007 其他人的权限掩码(不在组中)
S_IROTH 00004 其他人有读取权限
S_IWOTH 00002 其他人有写权限
S_IXOTH 00001 其他人有执行权限

(奇怪的是,在线手册页缺少这一部分。)

这是一个位域,我们可以看到最后四位数字匹配访问模式;前导数字(十六进制)与文件类型匹配,因此 81a4 的十六进制模式对应于“目录,模式 0644”,而 41ed 的十六进制模式对应于“常规文件,模式 0775”。