直接查看 stat 输出中的 modify: 行即可获取文件最后修改时间(mtime),即文件内容最后一次被写入的时间;最简命令为 stat filename,或用 stat -c '%y' filename(gnu 系统)提取纯时间。

stat 命令怎么看文件最后修改时间(mtime)
直接看 stat 输出里的 Modify: 行,它对应的就是 mtime —— 文件内容最后一次被写入的时间。这不是“访问时间”(atime)或“状态变更时间”(ctime),别混淆。
最简用法:stat filename,输出里会明确标出三类时间:
Access: 2024-03-15 10:22:34.123456789 +0800 Modify: 2024-03-14 16:45:02.987654321 +0800 ← 这个就是你要的 Change: 2024-03-14 16:45:02.987654321 +0800
- 如果只要 mtime 一行,用
stat -c '%y' filename(GNU 系统,如 Ubuntu/CentOS) - macOS 或 BSD 系统不支持
-c,得用stat -f '%Sm' -t '%Y-%m-%d %H:%M:%S' filename -
%y输出带纳秒和时区;要只看年月日时分秒,用%y后加| cut -d. -f1截断
为什么 ls -l 显示的时间有时和 stat 的 Modify 不一致
ls -l 默认显示的是 mtime,但有例外:当文件没有写权限、或挂载了某些文件系统(如 NFS、某些 FUSE 实现),mtime 可能没及时刷新,而 ls 缓存或内核接口返回了旧值。更关键的是:ls -l 在 long format 下,如果 mtime 距今超过 6 个月,它会改显示年份而非时间 —— 看起来像“不对”,其实是格式策略。
- 验证是否真不一致?运行
stat -c '%y' file和ls -l --time=modify file对比 -
ls -l --time=modify强制按 mtime 排序并显示,避免 atime/ctime 干扰 - 遇到 NFS 挂载点,
stat返回的 mtime 可能滞后几秒,这是服务端同步延迟,不是命令问题
批量查多个文件的最后修改时间(脚本友好格式)
别用 stat * 直接展开,遇到空格或特殊字符文件名会崩。稳妥做法是用 find 配合 -printf,或用 shell 循环加引号。
- GNU 系统推荐:
find . -maxdepth 1 -type f -printf '%p\t%T@ %T+\n' | sort -k2nr——%T@是 Unix 时间戳,%T+是可读格式,\t分隔便于后续 awk 处理 - 通用兼容写法:
for f in *.log; do [ -f "$f" ] && echo "$(stat -c '%y' "$f") $f"; done | sort - 注意:
stat -c在非 GNU 系统(如 Alpine 默认 busybox)根本不存在,此时必须切到stat -f或换用ls -ld --time=modify
stat 查出来的时间不准?先确认时区和文件系统行为
stat 显示的时间基于系统时区解释,但底层存储是 UTC。如果你在容器里、或跨时区挂载了远程文件系统(如 CIFS/Samba),看到的时间可能和宿主机或远端不一致,这不是 bug,是设计如此。
- 检查当前时区:
readlink /etc/localtime或date +%Z - ext4/xfs 正常情况 mtime 精确到纳秒;但某些嵌入式文件系统(如 squashfs、overlayfs)可能只支持秒级,
stat会补零 - 如果文件刚被
cp或rsync复制,且没加-p或--preserve=timestamps,mtime 就是复制时刻,不是源文件原时间
mtime 本身不记录“谁改的”或“怎么改的”,只记时间点。需要溯源操作,得结合 auditd、inotify 或日志系统,stat 做不到。










