文件的三种时间戳
每个 inode 上都记着三个时间:atime(最后访问时间)、mtime(内容最后修改时间)、ctime(inode 元数据最后变更时间)。ls 默认显示的是 mtime,stat 能一次看全三种。备份、同步、find 按时间筛选全都建立在 mtime 上;而 ctime 是排查「谁改了权限、谁动了文件」的关键,因为它无法被人工设置,只要权限、属主、硬链接数或文件名发生变化就会刷新。
基本信息
| atime | 最后访问时间,读取文件会更新(现代系统默认 relatime,更新被合并) |
|---|---|
| mtime | 内容最后一次修改的时间,ls 默认展示的就是它 |
| ctime | inode 元数据最后变更时间,权限、属主、改名都会触发,无法人工设置 |
| 查看方式 | stat 看三种;ls -lu 看 atime;ls -lc 看 ctime;find 的 -mmin/-cmin/-amin 按需筛选 |
典型使用场景
- 备份与同步:rsync、make 这类工具按 mtime 判断新旧,理解 mtime 才能预测它们的决策
- 按时间清理:find 的 -mtime、-mmin 是日志清理与过期文件回收的基础
- 入侵排查:ctime 在最近一段时间内的异常变化,往往对应权限被改或文件被替换
- 恢复核对:从备份还原后 mtime 通常保留原值,而 ctime 会全部刷新为新值,据此可判断文件是否被重新写入过
- 确认变更是否生效:改完配置文件后用 mtime 核对,避免改了另一个副本
查看三种时间
查看三种时间
stat -c '%n A=%x M=%y C=%z' app.log # 一次看全三个时间
stat -c '%Y' app.log # mtime 的 Unix 秒级时间戳
ls -lu app.log # 显示 atime
ls -lc app.log # 显示 ctime
stat -c '%w' app.log # 创建时间(需内核与 coreutils 支持)按时间查找与人工调整
按时间查找与人工调整
find /data -mmin -10 # 10 分钟内改过内容
find /etc -cmin -60 # 1 小时内元数据变更(应急排查常用)
find /var/log -newermt '2026-10-01 00:00' -type f | head
find /data -newer /tmp/reference # 比参照文件更新的文件
touch -d '2026-10-01 08:00' release.txt # 同时改 atime 与 mtime
touch -m -d '2026-10-01 08:00' data.csv # 只改 mtime
touch -r reference.txt target.txt # 让 target 的时间与参照文件一致三种时间对照
| 时间 | 何时更新 | 能否人工设置 | 典型用途 |
|---|---|---|---|
| atime | 读取文件内容时(受 relatime 影响被合并) | 可以,用 touch -a | 判断文件是否被读取过,精度有限 |
| mtime | 文件内容被写入时 | 可以,用 touch -d 或 touch -m | 备份、同步、按时间清理的主要依据 |
| ctime | inode 元数据变化时(权限、属主、改名、硬链接数) | 不可以,只能随操作变化 | 排查权限篡改与文件替换 |
现代 Linux 默认用 relatime 挂载,atime 不会每次读取都刷新:只有当前 atime 早于 mtime 或 ctime,或已超过约一天没更新时才会写入。所以 atime 不适合当作精确的访问审计依据,真要审计得靠审计子系统。
ctime 不是创建时间。要查创建时间需要文件系统支持 birth time(stat -c 加 w 格式符,较新的内核与 coreutils 可用);把 ctime 当创建时间会得出完全错误的结论。