首页/系统/Linux 运维命令速查/文件三种时间戳(atime/mtime/ctime)
文件与目录76 条

文件三种时间戳(atime/mtime/ctime)

访问时间、修改时间、元数据变更时间;理解三者差异是排查同步、备份与入侵篡改的基础。

Linux 运维命令速查系统更新于 2026-10-13

文件的三种时间戳

每个 inode 上都记着三个时间:atime(最后访问时间)、mtime(内容最后修改时间)、ctime(inode 元数据最后变更时间)。ls 默认显示的是 mtime,stat 能一次看全三种。备份、同步、find 按时间筛选全都建立在 mtime 上;而 ctime 是排查「谁改了权限、谁动了文件」的关键,因为它无法被人工设置,只要权限、属主、硬链接数或文件名发生变化就会刷新。

基本信息

atime最后访问时间,读取文件会更新(现代系统默认 relatime,更新被合并)
mtime内容最后一次修改的时间,ls 默认展示的就是它
ctimeinode 元数据最后变更时间,权限、属主、改名都会触发,无法人工设置
查看方式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备份、同步、按时间清理的主要依据
ctimeinode 元数据变化时(权限、属主、改名、硬链接数)不可以,只能随操作变化排查权限篡改与文件替换
现代 Linux 默认用 relatime 挂载,atime 不会每次读取都刷新:只有当前 atime 早于 mtime 或 ctime,或已超过约一天没更新时才会写入。所以 atime 不适合当作精确的访问审计依据,真要审计得靠审计子系统。
ctime 不是创建时间。要查创建时间需要文件系统支持 birth time(stat -c 加 w 格式符,较新的内核与 coreutils 可用);把 ctime 当创建时间会得出完全错误的结论。

易错点

  • 把 ctime 当成创建时间:它是元数据变更时间,复制、改名、改权限都会刷新,判断文件来历不能靠它
  • touch 篡改时间骗过同步工具:rsync 与 make 按时间判断新旧,被手工改过时间戳的文件可能导致该备份的没备份、该同步的没同步
  • 认为 atime 能当审计日志:relatime 合并了大量更新,很多读取不会留下痕迹
  • 从备份恢复后看到 ctime 全是新值就以为文件被改过:恢复动作本身就会刷新 ctime,判断依据应是内容摘要而不是时间戳

数据来源与参考

  • man 1 stat(GNU coreutils 手册)
  • mount(8) 手册(relatime 挂载选项)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌