LinuxShell命令stat

1. 简介

众所周知,Linux 下一切皆文件。当我们想要去查看某个文件的具体信息时,可以使用 stat 命令进行查看。

2. 格式

1
stat filename [filename...]

stat /home 为例,以下为我电脑的输出结果:

  • 中文显示
1
2
3
4
5
6
7
8
  文件:/home
大小:4096 块:8 IO 块:4096 目录
设备:815h/2069d Inode:15204353 硬链接:5
权限:(0755/drwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2021-06-12 15:24:19.791590697 +0800
最近更改:2021-01-14 13:22:37.236297689 +0800
最近改动:2021-01-14 13:22:37.236297689 +0800
创建时间:2020-04-12 02:04:12.604134012 +0800
  • 英文显示
1
2
3
4
5
6
7
8
  File: /home
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 815h/2069d Inode: 15204353 Links: 5
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-06-12 15:24:19.791590697 +0800
Modify: 2021-01-14 13:22:37.236297689 +0800
Change: 2021-01-14 13:22:37.236297689 +0800
Birth: 2020-04-12 02:04:12.604134012 +0800

可以看到,stat 命令能够查询到文件的信息有:

字段 说明
File 文件名
Size 文件大小
Blocks 文件占用的物理磁盘块数目
IO Block 文件系统进行 IO 操作的块大小
directory/regular file/symbolic link 文件类型
Device 设备编号
Inode 文件 Inode 号
Links 当前文件的硬链接数
Access 文件的权限
Uid 文件的 uid,表示文件的所有者
Gid 文件的 gid,表示文件的所有组
Access 文件的最近访问时间
Modify 文件的最近更改时间
Change 文件的最近改动时间
Birth 文件的创建时间

2.1 块信息

  • Blocks 表示的是文件实际占用的物理磁盘块个数,磁盘块大小固定为 512 字节。
  • IO Block 表示文件系统实际进行 IO 操作时,每次读写的块大小。因此 IO Block 因不同的文件系统而异,本人电脑为 ext4,故 IO Block 固定为 4096。

2.2 设备编号

  • 文件的设备编号占两个字节,第一个字节为设备主编号,第二个字节为设备从编号。

以上述例子为例,815h 表示十六进制结果,即 0x08152069d 表示十进制结果。0x0815 中,0x08 表示设备主编号,一般取决于设备类型,对于磁盘分区等块设备,一般主编号就是 0x080x15 表示设备从编号,这里就是表示此系统上的第 0x15 个块设备。可以查看 ls -l /dev/block,按照字母顺序排序,其中第 0x15 个设备便是本系统的磁盘分区。

【注】/dev 目录下除了包含块设备,也还有其他类型的设备,比如 CPU 设备等。

2.3 硬链接数

文件的硬链接数表示访问到该文件的方式数目,普通文件的硬链接数一般为 1,目录文件的硬链接数至少为 2。

  • 因为目录下默认包含 . 目录,通过 cd . 可以访问到该目录,因此至少为 2。
  • 每增加一个子目录,父目录的硬链接数就加 1,因为子目录下可以通过 cd .. 访问父目录。

2.4 文件时间信息

  • Access Time:简写为 atime,表示文件的最后访问时间。当文件被访问时,该时间被更新。
  • Modify Time:简写为 mtime,表示文件的最后修改时间。当文件的数据内容被修改时,该时间被更新。
  • Change Time:简写为 ctime,表示文件的最后更改时间。当文件的属性状态被修改时,该时间被更新。文件的属性状态即其 Inode 中的属性字段,当文件所有者、访问权限、文件内容发生改变时,文件的属性状态都会被更新。
  • Birth Time:简写为 btime,表示文件的创建时间。一旦文件创建,该时间就固定不变。

3. 选项

选项 说明
-L--dereference 显示符号链接所指向文件的信息
-f--file-system 展示文件系统的状态信息而不是文件的状态信息
-c--format=FORMAT 指定格式输出文件的某些状态信息
-t--terse 以简洁形式输出文件的状态信息
--cached=MODE 使用属性信息缓存的方式
--printf=FORMAT 类似 --format 选项,结尾无换行符,可以使用转义字符实现换行等操作
  • MODE 取值范围:alwaysneverdefaultalways 表示如果存在缓存信息则使用缓存信息;never 表示不使用缓存信息,并将最新属性信息同步到缓存;default 表示默认方式,取决于文件系统。
  • FORMAT 选项对于文件和文件系统的取值是不同的:
  1. 对于文件,FORMAT 可选选项如下表所示:
文件信息输出格式 说明
%a 八进制格式的文件权限
%A 可读形式的文件权限
%b 文件占用的磁盘块数
%B 磁盘块的字节大小
%C 如果存在,则表示文件的 SELinux 安全上下文
%d 十进制的设备编号
%D 十六进制的设备编号
%f 十六进制表示的 Raw 模式(文件类型 + 文件权限)
%F 文件类型
%g 文件所有组 ID
%G 文件所有组名称
%h 文件硬链接数
%i 文件 Inode 号
%m 文件所在分区的挂载点
%n 文件名称
%N 符号链接所链接到的文件名称
%o IO 块的字节大小
%s 文件的实际字节大小
%t 十六进制的主设备类型号
%T 十六进制的从设备类型号
%u 文件所有者 ID
%U 文件所有者名称
%w 文件的创建时区
%W 文件的创建时间(自 Epoch 开始的秒数)
%x 文件的最后访问时区
%X 文件的最后访问时间(自 Epoch 开始的秒数)
%y 文件的最后修改时区
%Y 文件的最后修改时间(自 Epoch 开始的秒数)
%z 文件的最后更改时区
%Z 文件的最后更改时间(自 Epoch 开始的秒数)

【注】文件信息的简洁模式等价于输出格式:%n %s %b %f %u %g %D %i %h %t %T %X %Y %Z %W %o

  1. 对于文件系统,FORMAT 可选选项如下表所示:
文件系统信息输出格式 说明
%a 普通用户可用的空闲块数
%f 文件系统可用的空闲块数
%b 文件系统的全部块数
%c 文件系统的全部文件节点数
%d 文件系统的空闲文件节点数
%i 十六进制表示的文件系统 ID
%l 文件名的最大长度
%n 文件名
%s 块大小(用于更快的传输)
%S 基本块大小(用于块计数)
%t 十六进制表示的文件系统类型
%T 文件系统类型

【注】文件系统信息的简洁模式等价于输出格式:%n %i %l %t %s %S %b %f %a %c %d

附录

参考资料: