touch创建文件时只能设置atime和mtime,无法修改只读的ctime;-t需严格格式如202206150900.00,-d支持自然语言更灵活,-m/-a不创建新文件,-c避免意外创建。

touch 创建带特定时间戳的文件,本质是「创建空文件 + 同时设定其 atime 和 mtime」,不是真正在系统层面设置“创建时间”(ctime 无法通过 touch 修改,它由内核在 inode 创建时自动写入且只读)。
用 -t 参数创建指定时间戳的空文件
touch -t 是最直接的方式,要求时间格式严格为 [[CC]YY]MMDDhhmm[.ss]。
比如想创建一个“2022年6月15日 09:00:00”的空文件 report.log:
touch -t 202206150900.00 report.log
- 如果
report.log不存在,就创建它,并把 atime/mtime 都设为该时间 - 如果已存在,就只更新它的 atime/mtime(不覆盖内容)
- 注意:年份必须是 4 位(
2022),不能写成22;秒可选,但带点号(.00)才被识别
常见错误:
- 写成
touch -t 2206150900 report.log→ 解析失败,返回非零退出码 - 漏掉点号:
touch -t 20220615090000 report.log→ 被当作YYMMDDhhmmss格式,可能误判为 2000 年
用 -d 参数更灵活地指定日期字符串
-d 支持自然语言描述,对人友好,底层由 date 解析,兼容性更好:
touch -d "2022-06-15 09:00:00" report.log
touch -d "last Friday" backup.tar.gz
touch -d "yesterday 14:30" notes.txt
- 不用记格式,支持 ISO 8601、相对时间、英文日期短语
- 同样:文件不存在则创建,存在则更新时间戳
- 但注意:某些老旧 shell 或最小化系统(如 Alpine 的 busybox 版
touch)可能不支持-d,优先验证touch --help是否列出该选项
只设修改时间或只设访问时间时不能创建新文件
如果加了 -m 或 -a,touch 就默认只操作已有文件:
touch -m -t 202301010000.00 newfile → 报错:touch: cannot touch 'newfile': No such file or directory
因为:
-
-m和-a是“修改已有文件的某一项时间”,不是创建语义 - 要创建 + 单独设 mtime,得两步:
touch newfile && touch -m -t 202301010000.00 newfile - 或者直接用
-t(它隐含同时设 atime/mtime,且支持创建)
-c 选项容易被忽略但很关键
当你不确定目标路径是否存在,又不想意外创建文件时,加 -c 可避免副作用:
touch -c -t 202401010000.00 /tmp/expected.conf
- 如果
/tmp/expected.conf不存在,什么也不做,退出码为 0(不报错) - 如果存在,才更新其时间戳
- 这在脚本中做“安全更新”时很有用,比如只同步时间戳,不干预文件存在性
别把它和 --no-create 混淆——它们等价,但 -c 更通用。
真正的难点不在语法,而在于理解:你设的从来不是“创建时间”,而是 atime/mtime;而 ctime 总是当前真实时间,谁也改不了。











