access、modify、change 分别表示文件最后一次读取内容、修改内容、修改元数据的时间;linux 文件系统默认不存创建时间;可用 -c 定制输出格式,支持批量处理与错误检查。

stat 命令输出字段含义不明确?先看懂三组时间戳
Linux 中 stat 默认输出的 Access、Modify、Change 时间常被混淆。它们不是“创建时间”(Linux 文件系统普遍不存创建时间),而是:
-
Access:最后一次读取文件内容的时间(如cat、grep),受noatime挂载选项影响,可能不更新 -
Modify:最后一次修改文件「内容」的时间(如echo >>、vim保存) -
Change:最后一次修改文件「元数据」的时间(如chmod、chown、重命名),比Modify更敏感
执行 stat /etc/hosts 就能直观看到三者差异。若发现 Access 长期不变,大概率是 root 分区挂载了 noatime。
想定制输出格式?用 -c 参数控制字段和顺序
默认输出冗长且固定,实际排查时往往只需几个关键字段。用 -c(custom format)可精确控制:
-
stat -c "%n %y %x %z" /var/log/syslog:分别输出文件名、Modify 时间、Access 时间、Change 时间 -
stat -c "%U:%G %a %s" /home/user/file.txt:输出所有者:组、八进制权限、文件大小(字节) - 常用转义符:
%n(文件名)、%U(用户名)、%G(组名)、%a(权限八进制)、%A(权限符号形式,如rw-r--r--)、%s(大小)、%y(Modify 时间,完整格式)、%y可换成%y(ISO 格式)或%y(短格式)
注意:%y 和 %x 默认带纳秒精度,如需可读性更强的时间,加 --printf 并配合 date 转换,但多数场景直接用 %y 足够。
stat 查不到“创建时间”?这不是 bug,是 ext4/xfs 的设计限制
执行 stat 后找不到 Birthday 或 Birth 字段,不是命令用错,而是主流 Linux 文件系统(ext4、XFS 默认配置)根本不存储文件创建时间。部分新内核 + XFS 启用 inode64 和 projid32bit 并开启 file creation time 特性后才支持,但发行版默认关闭。
- 验证是否支持:
stat -c "%w" /tmp/test,若输出-或空,说明未启用 - 替代方案:用
debugfs(ext4)或xfs_info(XFS)查底层信息,但需 root 权限且不保证稳定 - 生产环境别依赖“创建时间”做逻辑判断,改用
Modify或日志文件名中的时间戳更可靠
批量查看多个文件?避免 for 循环,用 -f 或 xargs 更稳
对目录下所有 .log 文件查大小和 Modify 时间,别写 for f in *.log; do stat $f; done —— 文件名含空格或特殊字符时会崩。
- 推荐:
stat -c "%n %s %y" *.log(shell 自动展开,stat原生支持多参数) - 更安全(尤其处理 find 结果):
find /var/log -name "*.log" -print0 | xargs -0 stat -c "%n %s %y" - 如果要带文件路径前缀,
stat -f不适用;但-f是查「文件系统统计信息」(如stat -f /看磁盘总空间),别和批量搞混
真正容易被忽略的是:当文件不存在或权限不足时,stat 会输出错误到 stderr 但返回码仍是 0,脚本中要用 || 显式捕获或检查 stat 输出是否含 No such file 字样。










