应使用 touch -m 修改文件修改时间(mtime),避免影响访问时间(atime)和状态变更时间(ctime);支持自然语言(-d)或严格格式(-t)设定,批量操作优先用 find + xargs/-exec,注意符号链接需加 -h、时区影响及权限问题。

mtime 用 touch -m,别碰 ctime(它由内核自动更新,不可手动设)。
只改修改时间(mtime),不碰访问时间(atime)
这是最常见也最安全的操作:你只想让文件“看起来是昨天改的”,但不想影响它的访问记录。
- 用
-m+-d:支持自然语言,可读性强touch -m -d "2024-03-15 09:22:00" report.txt - 用
-m+-t:格式严格,适合脚本固化touch -m -t 202403150922.00 report.txt(注意是YYMMDDhhmm.ss,不是 ISO 格式) - 验证是否生效:
stat report.txt看 “Modify” 行,确认只有这一项变了,“Access” 保持原样
批量修改一堆文件的 mtime
别用 for 循环套 touch,效率低还容易出错;优先走 find + xargs 或 -exec。
- 给当前目录所有
.log文件设统一 mtime:find . -maxdepth 1 -name "*.log" -print0 | xargs -0 touch -m -d "2025-06-01" - 递归改子目录下所有
config.yaml的 mtime:find /etc -name "config.yaml" -exec touch -m -d "2026-01-01" {} \; - 注意权限:如果目标文件属主不是你,
touch会失败,加sudo前先确认必要性——改时间戳本身不涉及内容变更,通常不需要 root
想“伪造创建时间”?Linux 没有真正意义上的创建时间字段
ext4 虽然底层支持 birth time(btime),但 touch 不提供写入接口,stat 也常显示 -。所谓“模拟创建时间”,实际是把 mtime 和 atime 都设成同一值,再配合业务逻辑解释。
- 不要用
touch -d同时覆盖两者来“假装刚创建”——这会破坏原本的访问行为痕迹 - 若真需统一时间戳(比如归档打包前重置),明确用:
touch -d "2026-07-01 00:00:00" file1 file2 dir/ - CentOS 7.9(已 EOL)等老系统对
btime支持更弱,连stat -c "%w" file都可能报错或返回空,别依赖
常见踩坑点:符号链接、挂载选项、时区
touch 默认操作的是符号链接指向的目标文件,不是链接本身——这点和 ls -l 直观感受相反。
- 要改软链自己的时间戳,必须加
-h:touch -h -m -d "yesterday" mylink - 某些挂载参数(如
noatime)会禁用atime更新,但不影响mtime——所以单独改-m总是有效的 -
-d解析依赖本地时区,不是 UTC;-t也是按系统时区解释。跨时区同步文件时,建议统一用 UTC 字符串:touch -m -d "2026-07-09 10:00:00 UTC" file
mtime 判断是否重新编译,乱设可能跳过关键步骤。


















