创建空文件或更新访问、修改时间,常用于脚本时间戳与构建标记。
touch 默认把文件的访问时间和修改时间更新为当前时间;文件不存在时创建一个空文件,权限由 0666 与 umask 决定。-a 只改访问时间,-m 只改修改时间,-c 在文件不存在时不创建,-r 参考文件 复制另一个文件的时间,-h 修改符号链接自身的时间(隐含 -c)。
BSD 与 GNU 的差异集中在时间参数:macOS 的 -d 只接受 YYYY-MM-DDThh:mm:SS[.frac][tz] 这类格式,不能写 GNU 的 next Friday、yesterday 等自然语言;GNU 还有 --date、--reference、--no-create 长选项,macOS 没有。-t 的格式是 [[CC]YY]MMDDhhmm[.SS],两位年份的解释规则容易踩坑,脚本里优先用四位数年份。
touch 不会改变文件的创建时间(birth time),也不会修改 ACL、扩展属性或文件内容。APFS 支持纳秒级时间戳,用 stat -f '%Sm %SB' 可以分别查看修改时间和创建时间。
# 创建空文件
% touch newfile.txt
# 文件不存在时不创建,只更新时间
% touch -c existing.txt
# 用固定时间设置构建标记,格式为 YYYYMMDDhhmm
% touch -t 202610220900 .build-stamp
# 带时区的 ISO 时间,Z 表示 UTC
% touch -d '2026-10-22T09:00:00Z' .deploy-ok
# 复制参考文件的时间,便于让产物与源文件时间一致
% touch -r source.swift build/output.swift
# 只改符号链接自身的时间,不碰目标文件
% touch -h ~/Desktop/link
# 验证修改时间与创建时间
% stat -f 'mtime=%Sm birth=%SB' .build-stamp
touch -t 的两位年份有歧义,26 通常表示 2026,99 表示 1999;脚本统一写四位年份,避免跨世纪误判。-d 不是 GNU 日期解析器,touch -d yesterday file 会报错。需要相对时间时用 date -v-1d 先生成时间字符串,再传给 -t。touch 只改时间,不会把旧文件内容清空;要清空内容用 : > file 或 truncate -s 0 file。touch 修改,只能读取。需要“看起来像新文件”时改的是 mtime,不是 birth time。-h 会隐含 -c,目标链接不存在时不会创建,容易误以为命令失败。touch 会报 Read-only file system / Operation not permitted,sudo 也不能绕过。ls — 用 -lT 查看完整时间。find — 按 mtime 筛选文件。stat — 查看 atime、mtime、ctime 与 birth time。touch — GNU 版对照,-d 支持自然语言。attrib — Windows 下查看和修改文件属性。合上页面,先回答,再展开对照。
touch -d 与 GNU 的 touch -d 最大差别是什么?touch 能修改文件的创建时间吗?不能的话它改的是什么?touch -h 对符号链接做了什么,为什么可能“没有创建文件”?yesterday 等自然语言解析。-h 隐含 -c,链接不存在时不会创建。
小程序版
微信扫码,随时查命令