stat 命令详解

stat 是 Linux 下用于查看文件或文件系统元数据(metadata) 的命令。它从 inode 中读取信息并格式化输出。

基本用法

stat [选项] 文件...

输出解读

$ stat test.txt
  文件:test.txt
  大小:1024          块:8          IO 块:4096    普通文件
设备:fd01h/64769d    Inode:654321    硬链接:1
权限:(0644/-rw-r--r--)  Uid:( 1000/  user)   Gid:( 1000/  user)
访问时间:2026-06-01 10:00:00.123456789 +0800
修改时间:2026-06-01 09:00:00.987654321 +0800
状态更改时间:2026-06-01 08:00:00.000000000 +0800
创建时间:2026-05-30 14:00:00.000000000 +0800
字段含义关联知识点
大小文件实际内容的字节数
文件占用的磁盘块数(通常 1 块 = 512 字节)与”大小”不同,涉及 inode 块指针
IO 块文件系统的逻辑块大小(通常 4096)文件系统块大小
设备设备编号(主:次十六进制/十进制该文件所在的分区
Inodeinode 编号Inode 详解
硬链接link count指向此 inode 的目录项数量
权限数字 + 符号形式的权限位0644 = rw-r--r--
Uid / Gid用户 ID / 组 ID 及名称文件拥有者
访问时间atime,最后一次读取内容的时间频繁访问会更新此时间
修改时间mtime,最后一次修改内容的时间ls -l 默认显示此时间
状态更改时间ctime,最后一次修改 inode 元数据的时间改权限/重命名/增减链接数都会更新
创建时间btime(Birth time),文件创建时间并非所有文件系统支持(ext4 支持)

常用选项

-f:查看文件系统信息

$ stat -f /
 
文件:"/"
  ID:a1b2c3d4e5f6a7b8 文件名长度:255     块大小:4096
  块总数:48857088     可用块:10485760     可用块(非root):9437184
  Inode 总数:12222464  可用 Inode:10000000

用于排查:磁盘空间不足、inode 耗尽等问题。

-c / --format:自定义输出格式

# 只看 inode 和 link count
stat -c '%i %h %n' test.txt
# 输出:654321 1 test.txt
 
# 只查看权限(八进制)
stat -c '%a' test.txt
# 输出:644
 
# 只查看文件大小
stat -c '%s' test.txt
# 输出:1024

常用格式占位符

占位符含义
%iinode 编号
%hlink count
%s文件大小(字节)
%a权限(八进制)
%A权限(可读格式,如 rw-r--r--
%n文件名
%F文件类型(“普通文件”、“目录”等)
%y最后修改时间(mtime)
%x最后访问时间(atime)
%z最后状态更改时间(ctime)
%w创建时间(btime)

-t:简洁模式(terse)

$ stat -t test.txt
test.txt 1024 8 81a4 1000 1000 fd01 654321 1 0 0 1717200000 1717196400 1717192800 1717056000 4096

各字段依次为:文件名、大小、块数、权限(八进制)、uid、gid、设备号、inode、link count、… 时间戳(unix timestamp)。适合脚本解析。

ls -l 的对比

对比项ls -lstat
信息量精简(大小、权限、mtime、文件名)完整(含 atime、ctime、inode、块信息)
格式灵活性固定格式可通过 -c 自定义
时间精度秒级纳秒级
文件系统信息不支持支持 -f
批量处理支持目录列表逐个文件或路径
# stat 可同时查看多个文件
stat file1.txt file2.txt file3.txt

典型应用场景

# 文件是否有硬链接?
stat -c '%h %n' *.txt
# 输出 link count > 1 表示有硬链接指向同一 inode

2. 确认文件是否被修改

# 监控 mtime 和 ctime
stat --printf='mtime: %y\nctime: %z\n' /etc/passwd

3. 排查文件系统 inode 使用率

# 检查 /var 分区的 inode 是否耗尽
stat -f /var | grep -E 'Inode|可用'

4. 脚本中使用

# 获取文件大小(比 wc -c 更快,不读取内容)
size=$(stat -c '%s' largefile.bin)

注意事项

  • atime 的更新行为:现代 Linux 使用 relatime 挂载选项,atime 不会每次读取都更新,避免性能损耗
  • btime(创建时间):并非所有文件系统支持——ext4、xfs、btrfs 支持,但 tmpfs、NFS 可能不支持
  • ctime ≠ 创建时间ctime 是 inode 状态变更时间(改权限、重命名、改链接数等),btime 才是真正的创建时间

相关笔记