stat命令是Linux查看文件元数据的核心工具,可显示权限、所有者、三类时间戳(atime/mtime/ctime)并支持自定义格式输出与时间戳验证;ctime非创建时间,birth time需stat -c '%w'查看;修改时间戳需用touch配合stat验证。

stat 命令是 Linux 下查看和操作文件元数据最直接的工具,不仅能显示权限、所有者、大小等基础信息,还能精准呈现三类时间戳(访问、修改、状态变更),并支持自定义格式输出与时间戳修改。
看清三类时间戳的区别与含义
Linux 文件有三个独立的时间戳,stat 默认显示它们,但容易混淆:
- Access (atime):文件内容最后一次被读取的时间(如 cat、less、cp 读源文件)
- Modify (mtime):文件内容最后一次被修改的时间(如 echo 写入、vim 保存)
- Change (ctime):文件元数据或内容最后一次变更的时间(如 chmod、chown、mv、写入都触发 ctime 更新)
注意:ctime 不是“creation time”,Linux 文件系统通常不记录创建时间;ext4/xfs 等新版本虽支持 birth time(btime),但 stat 默认不显示,需用 stat -c '%w' file 查看(若内核和文件系统支持)。
用 stat 定制化查看关键元数据
避免冗长默认输出,用 -c(custom format)精准提取所需字段:
- 只看三时间戳(易读格式):
stat -c '%n: atime=%x, mtime=%y, ctime=%z' file.txt - 显示 inode、硬链接数、设备号:
stat -c 'inode:%i links:%h dev:%d' file.txt - 以 Unix 时间戳形式输出(便于脚本处理):
stat -c '%X %Y %Z' file.txt(对应 atime/mtime/ctime 秒级时间戳)
加 --printf 可实现更灵活换行与对齐,适合批量分析。
安全修改时间戳:touch 是主力,stat 仅辅助验证
stat 本身不能修改时间戳,但常与 touch 配合使用——先用 stat 查看原始值,再用 touch 精确设置:
- 仅更新 mtime(同时同步 atime):
touch -m file.txt - 设为指定时间(ISO 格式):
touch -d "2023-05-12 14:30:00" file.txt - 复制另一文件的时间戳:
touch -r ref_file.txt target.txt - 仅改 atime 或 mtime(不联动):
touch -a -d "yesterday" file.txt或touch -m -d "2024-01-01" file.txt
修改后务必用 stat file.txt 验证,尤其注意 ctime 总会随任何修改自动更新,无法单独设定。
排查常见时间异常场景
某些现象看似“时间不准”,实为挂载选项或内核行为导致:
-
noatime 挂载时,读文件不会更新 atime —— 这是性能优化,默认启用,
mount | grep noatime可确认 - SSD 或某些文件系统(如 btrfs)可能启用 relatime,只在 atime 早于 mtime/ctime 时才更新,减少磁盘写入
- 容器或 NFS 挂载中,时间戳可能受宿主机或服务器时钟影响,需检查时区与 NTP 同步状态
遇到时间“冻结”或“倒流”,优先查挂载参数而非怀疑 stat 输出错误。










