touch命令主要用于创建空文件或更新文件的atime和mtime时间戳,不修改内容;默认同时更新atime和mtime,可用-a、-m单独控制,-t/-d指定时间,-r复制参考文件时间戳,但无法直接修改ctime。

用 touch 修改文件时间戳确实能绕过一些依赖时间判断的自动化脚本(比如构建工具、备份系统或监控脚本),但关键在于精准控制时间字段,而不是简单“碰一下”文件。
明确要改哪几个时间戳
touch 默认只更新访问时间(atime)和修改时间(mtime),而很多脚本实际检查的是 mtime(例如 Makefile 依赖、rsync 的 -t 选项)。但有些场景(如容器镜像构建缓存、某些 CI 工具)也会看 ctime(状态变更时间),而 touch 无法直接修改 ctime——它随 inode 变更自动更新,比如改权限、改属主就会变。所以别试图“伪造 ctime”,专注 mtime 和 atime 更实际。
用 -d 或 -t 精确指定时间
避免用默认行为,直接赋值目标时间:
-
touch -d "2023-01-01 12:00:00" file.txt—— 支持自然语言格式,最常用 -
touch -t 202301011200.00 file.txt—— 使用 YYYYMMDDHHMM.SS 格式,适合脚本硬编码 -
touch -d "@1672574400" file.txt—— 传 Unix 时间戳,适合从日志或 API 获取时间后复用
只改 mtime,不动 atime(减少副作用)
有些系统启用了 noatime 挂载选项,或者你不想触发其他依赖 atime 的逻辑。这时加 -m 参数:
-
touch -m -d "2023-01-01" script.sh—— 仅更新 mtime,atime 保持原样 - 配合
-r ref_file可批量同步时间:touch -m -r template.conf *.conf
批量处理与脚本联动技巧
单个文件好办,批量时注意 shell 展开和空格安全:
- 用
find配合-exec:find . -name "*.log" -exec touch -m -d "yesterday" {} + - 避免 for 循环解析含空格路径:用 while read -r;或直接用数组+printf %q
- 若脚本依赖“比某个文件新”,可先
touch -r trigger_file dummy,再touch -d "$(stat -c '%y' dummy)" target*
时间戳不是万能掩护,过度使用可能破坏调试线索或违反审计要求。优先确认目标脚本真正检查哪个时间点、是否校验文件内容哈希,再决定是否用 touch 干预。











