Linux `stat` 命令详解
🐧 Linux stat 命令详解
📌 学习目标
- 掌握
stat命令的基本使用方法,理解其输出内容的含义。- 熟悉
stat在文件属性查看、权限分析、时间戳管理中的实际应用场景。- 能够通过
stat查看 inode 信息、访问控制列表(ACL)、文件系统类型等底层数据。
- 了解不同 Linux 发行版(Ubuntu、CentOS、EulerOS)中
stat的行为差异。
🔍 核心重点(Key Points)
| 主题 | 内容摘要 |
|---|---|
| 命令用途 | 查看文件或文件系统的详细状态信息 |
| 输出内容 | 文件类型、权限、inode、硬链接数、用户/组ID、大小、时间戳等 |
| 支持格式化输出 | 可自定义显示字段(如 %A %n %s) |
| 适用对象 | 普通文件、目录、设备、符号链接、挂载点等 |
| 权限要求 | 普通用户即可查看自身文件;系统文件需 sudo |
| 注意事项 | 时间戳精度受文件系统支持影响(如 ext4 vs FAT32) |
| 兼容性 | Ubuntu、CentOS、EulerOS 行为基本一致 |
📘 详细讲解(In-Depth Explanation)
📖 1. stat 是什么?
stat 是 Linux 中用于查看文件或文件系统状态信息的命令,全称是 status。它比 ls -l 提供了更详细的元数据信息,包括:
- 文件类型(普通文件、目录、字符设备等)
- 权限模式(八进制和符号表示)
- inode 编号
- 硬链接数量
- 所有者 UID 和所属组 GID
- 文件大小及块分配情况
- 时间戳(Access、Modify、Change)
- 文件系统类型、UUID、挂载选项等(当用于挂载点时)
🛠️ 2. 安装 stat
stat 属于 coreutils 工具集,大多数 Linux 系统默认已安装:
which stat
# 输出:/usr/bin/stat
如未安装,可手动安装:
# Ubuntu/Debian
sudo apt install coreutils
# CentOS/RHEL/EulerOS
sudo yum install coreutils
📌 3. 基本语法结构
stat [OPTION]... FILE...
🧪 4. 常用参数与功能解析
| 参数 | 含义 | 示例 |
|---|---|---|
-c, --format=FORMAT |
自定义输出格式 | stat -c "%n %A %U %G" file.txt |
--file-system |
显示文件系统信息而非文件本身 | stat --file-system /home |
-t, --terse |
简洁输出格式 | stat -t file.txt |
-L |
遵循符号链接(默认行为) | stat -L symlink |
-H 或 -P |
控制是否跟随符号链接(高级用法) | stat -H symlink |
--time-style=STYLE |
自定义时间格式(long-iso, full-iso 等) | stat --time-style=long-iso file.txt |
🧩 5. 使用案例与实战演练
✅ 案例 1:查看文件详细信息
stat file.txt
输出示例:
File: file.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 1234567 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2025-06-20 10:00:00.000000000 +0800
Modify: 2025-06-20 10:00:00.000000000 +0800
Change: 2025-06-20 10:00:00.000000000 +0800
Birth: -
✅ 案例 2:仅查看文件权限(符号形式)
stat -c "%A %n" file.txt
输出:
-rw-r--r-- file.txt
✅ 案例 3:查看文件系统信息
stat --file-system /home
输出示例:
File: "/home"
ID: 1234567890ab Namelen: 255 Type: ext4
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 1234567 Free: 123456 Available: 123456
Inodes: Total: 1234567 Free: 123456
✅ 案例 4:批量查看多个文件的信息
stat file1.txt file2.txt
适用于调试脚本时快速查看多个文件的状态。
✅ 案例 5:查看软链接本身的 stat 信息
ln -s file.txt mylink
stat -L mylink # 查看目标文件
stat -h mylink # 查看链接自身(部分系统不支持,建议用 ls -l)
📊 6. 输出字段详解(结合案例)
| 字段 | 含义 | 实际值示例 |
|---|---|---|
File |
文件名 | file.txt |
Size |
文件大小(字节) | 1024 |
Blocks |
分配的磁盘块数 | 8 |
IO Block |
每次 I/O 操作的最大块大小 | 4096 |
regular file |
文件类型 | directory, character special 等 |
Device |
设备编号(十六进制/十进制) | 801h/2049d |
Inode |
inode 编号 | 1234567 |
Links |
硬链接数 | 1 |
Access |
权限(符号+八进制) | (0644/-rw-r--r--) |
Uid |
用户 ID 和用户名 | (1000/user) |
Gid |
组 ID 和组名 | (1000/user) |
Access |
最后访问时间 | 2025-06-20 10:00:00 |
Modify |
最后修改内容时间 | 2025-06-20 10:00:00 |
Change |
最后更改元数据时间 | 2025-06-20 10:00:00 |
Birth |
文件创建时间(非所有文件系统支持) | - |
🧠 7. 时间戳详解(Access、Modify、Change)
| 类型 | 含义 | 触发时机 |
|---|---|---|
Access(atime) |
最后一次被读取的时间 | cat file.txt |
Modify(mtime) |
文件内容最后一次被修改的时间 | echo "hello" > file.txt |
Change(ctime) |
文件元数据(权限、所有者等)最后一次更改时间 | chmod 755 file.txt |
⚠️ 注意:
atime可能因性能优化被禁用(mount 时加noatime)ctime更改不一定意味着内容变化birth创建时间不是所有文件系统都支持(如 ext4 支持,但 FAT32 不支持)
📁 8. 高级技巧与应用场景
🧰 技巧 1:格式化输出指定字段
stat -c "%n 的大小是 %s 字节,权限是 %A,最后修改时间:%y" file.txt
输出:
file.txt 的大小是 0 字节,权限是 -rw-r--r--,最后修改时间:2025-06-20 10:00:00.000000000 +0800
常用格式符如下:
| 格式符 | 含义 |
|---|---|
%n |
文件名 |
%s |
文件大小(字节) |
%A |
权限(符号表示) |
%a |
十六进制权限 |
%U |
所有者用户名 |
%u |
UID 数值 |
%G |
组名 |
%g |
GID 数值 |
%y |
修改时间(完整) |
%x |
访问时间 |
%z |
状态改变时间 |
🧰 技巧 2:统计目录下所有文件的总大小
find /path/to/dir -type f -exec stat -c "%s" {} \; | awk '{sum += $1} END {print sum}'
🧰 技巧 3:监控文件变化
watch -n 1 'stat -c "%y %x %z" file.txt'
每秒刷新 file.txt 的三个时间戳,可用于调试脚本执行前后的影响。
🧪 9. 不同发行版行为比较(Ubuntu vs CentOS vs EulerOS)
| 特性 | Ubuntu 20.04+/22.04 | CentOS 7/8 | EulerOS 2.9+ |
|---|---|---|---|
| 默认安装 | ✅ 是 | ✅ 是 | ✅ 是 |
--file-system 支持 |
✅ 是 | ✅ 是 | ✅ 是 |
符号链接处理 -L |
✅ 是 | ✅ 是 | ✅ 是 |
| 时间戳精度 | ✅ 高精度(ext4) | ✅ 高精度 | ✅ 高精度 |
| SELinux/AppArmor 影响 | ❌(AppArmor) | ✅(SELinux) | ✅(华为定制内核) |
birth 时间支持 |
✅(ext4) | ✅(ext4) | ✅(ext4) |
🧹 10. 常见问题与注意事项
❓ 为什么 stat 显示的 atime 没有更新?
可能是因为文件系统挂载时使用了 noatime 选项,以提升性能。你可以检查 /etc/fstab 或运行:
mount | grep noatime
❓ 如何让 stat 显示简洁时间格式?
使用:
stat --time-style=long-iso file.txt
❓ stat 和 ls -l 的区别?
| 功能 | stat |
ls -l |
|---|---|---|
| 显示详细程度 | 极高(含 inode、block、时间戳等) | 中等(仅基础权限和时间) |
| 可定制输出 | ✅ 支持格式化输出 | ❌ 固定格式 |
| 时间戳精度 | ✅ 微秒级 | ❌ 通常只显示到秒 |
| 是否显示 ACL | ❌ | ✅(带 + 标记) |
📝 总结
stat 是一个非常强大的工具,能够帮助你深入理解 Linux 文件系统的底层结构和行为。掌握它可以让你:
- 快速诊断文件权限问题
- 监控文件变更行为
- 调试脚本执行效果
- 理解时间戳机制
- 优化文件系统性能设置(如 atime/noatime)
🧠 实战建议
- 在编写自动化脚本前,先用
stat查看文件状态,避免误操作 - 结合
find、awk、grep等命令实现复杂的数据提取任务 - 对关键日志或配置文件定期使用
stat监控其修改时间 - 使用
--file-system检查磁盘空间分配情况,辅助容量规划
如果你有具体想了解的 stat 应用场景或者追加问题,请告诉我👇
例如:
- 追加问题:如何用
stat查看文件的 inode 编号? - 追加问题:为什么
stat显示的 atime 没有更新?

浙公网安备 33010602011771号