stat 是什么
stat 显示文件的详细属性:大小、inode、链接数、权限与三个时间戳。它比目录列表更完整,在排查同步与备份问题时尤其有用——很多工具判断「文件是否变化」依赖的正是这几个时间。理解三个时间戳的含义差别,是用好它的前提。
基本信息
| 适用平台 | Linux、Unix;GNU 与 BSD 的参数互不兼容 |
|---|---|
| 命令语法 | stat [选项] 文件... |
| 常用选项 | -c 自定义输出格式 / -f 显示文件系统信息 / -L 跟随符号链接 / -t 简洁格式 |
| 常用占位符 | 文件名、字节数、inode 号、八进制权限、属主属组、三个时间 |
典型使用场景
- 排查同步异常:确认文件的修改时间与预期是否一致
- 查看 inode 与链接数:判断硬链接与同一份数据
- 确认权限与属主:比目录列表更明确
- 查看所在文件系统的块大小与 inode 使用情况
- 脚本取值:用自定义格式输出,便于解析
常用示例
常用示例
stat app.log
stat -c '%n 大小=%s 权限=%a 属主=%U 修改=%y' /etc/passwd
stat -f / # 查看所在文件系统信息
stat -L /usr/bin/python3 # 跟随符号链接看目标文件
stat -c '%i %h %n' * # inode 与硬链接数三个时间戳
| 时间 | 含义 | 易错点 |
|---|---|---|
| 访问时间 | 最后一次读取内容的时间 | 受挂载选项影响,不可靠 |
| 修改时间 | 最后一次改变内容的时间 | 备份与同步的判断依据 |
| 状态变更时间 | 最后一次改变元数据的时间 | 不是创建时间 |
状态变更时间不是创建时间,而是权限、属主、链接等元数据最后一次变化的时间,排查文件篡改时经常被误读。
自定义输出格式在 GNU 与 BSD 上写法不同,配套的文件系统查询选项在两种实现里的含义也不一样,跨平台脚本要分别验证。需要机器可读的结果时优先用自定义格式,不要解析默认的多行文本。
常用格式占位符
| 占位符 | 含义 | 用途 |
|---|---|---|
| %n | 文件名 | 批量输出时标识条目 |
| %s | 字节数 | 核对文件大小 |
| %a | 八进制权限位 | 脚本比对权限 |
| %U 与 %G | 属主与属组名 | 确认归属关系 |
| %i | inode 号 | 判断是否同一份数据 |
| %Y %X %Z | 修改、访问、变更时间的 epoch 秒 | 便于数值比较与排序 |
脚本里做时间比较时用 %Y 这类 epoch 秒更省事,不必解析人类可读的时间字符串,需要展示时再用 date -d @值 转回来。这些占位符属于 GNU 方言,BSD 与 macOS 的 stat 改用 -f 加格式串,写法完全不同,跨平台脚本要分支处理。