应优先使用 stat 查看文件时间戳,因其能准确、统一、可脚本化输出 atime/mtime/ctime;ls -l 仅显示 mtime 且格式易变,find -mtime 语义易误解,均需配合 stat 验证。

直接看 stat,别用 ls -l 猜时间——它只显示 mtime,且格式不统一、时区易混淆,还可能被 TIME_STYLE 干扰。
用 stat 查看完整时间戳(含 atime/mtime/ctime)
stat 是唯一能同时、准确、可脚本化输出三类时间的命令。它默认显示人类可读格式,并带时区;用 -c 可定制字段,避免解析错误。
- 查看全部时间:运行
stat filename,输出里明确标出 “Access”、“Modify”、“Change” 对应的时间 - 只取 mtime(内容修改时间)的可读格式:运行
stat -c '%y' filename,输出如2026-07-07 22:15:33.456789000 +0800 - 只取 mtime 的 Unix 时间戳(秒级):运行
stat -c '%Y' filename,结果是整数,适合比较或传给其他程序 - 注意:
%y包含纳秒和时区,%Y是纯整数;若需去掉时区影响做跨系统比对,优先用%Y
用 ls -l 看 mtime 时的常见误判
ls -l 默认显示 mtime,但它的输出格式会随文件年龄自动切换:6个月内显示“月 日 时:分”,超过则显示“月 日 年”。这导致同一命令在不同文件上输出结构不一致,脚本解析极易出错。
- 想强制统一格式?先执行
export TIME_STYLE='+%Y-%m-%d %H:%M:%S',再跑ls -l filename - 但即便如此,
ls -l仍无法直接显示 atime 或 ctime;要查 atime 得加--time=atime,查 ctime 得加--time=ctime - 权限、所有者、大小这些属性
ls -l能看,但硬链接数、inode、IO 块大小等必须靠stat
按修改时间筛选文件,别只信 -mtime 的字面意思
find -mtime N 的逻辑是“距今 N 个完整 24 小时段”,不是“N 天前”。比如 -mtime 0 指过去 24 小时内(含当前时刻),-mtime +3 指 72 小时之前(不含最近 72 小时),容易踩坑。
- 查今天修改的文件(精确到日):用
find /path -type f -newermt 'today',比-mtime 0更直观可靠 - 查某具体日期修改的文件:用
find /path -type f -newermt '2026-07-07' ! -newermt '2026-07-08' - 如果系统不支持
-newermt(如旧版 findutils),退回-mtime,但务必配合stat -c '%y' {} \;验证结果,避免因时间四舍五入导致漏匹配
修改时间后,ctime 也会变,但 touch 不一定按你预期改
只要文件内容或元数据(权限、所有者等)被修改,ctime 就必然更新——这是内核强制行为,无法绕过。而 touch 的行为常被误解:
-
touch -m -t 202607071200 file只改 mtime 和 atime(如果没禁用 atime),但 ctime 仍会变成当前时间 -
touch -c不创建文件,但不会改任何时间;touch -a -m -d "2026-07-07"才能精准设定 atime/mtime,而 ctime 依然会更新 - 真正想冻结 ctime?做不到。Linux 不提供用户态接口修改 ctime,它是状态变更的不可篡改记录
实际操作中,stat 是真相入口,ls -l 只适合人眼快速扫视,find -mtime 要搭配 stat 验证才放心。时间相关操作最易受时区、挂载选项(如 noatime)、系统 clock drift 影响,别跳过验证步骤。











