linux 文件系统不存创建时间,但可精确控制访问时间(atime)和修改时间(mtime);常用 touch -m 修改 mtime,-r 复制参考文件时间戳,find 配合 -exec 递归修改,注意区分 atime/mtime/ctime 语义。

Linux 文件系统(如 ext4)本身不存储“创建时间”(birth time),stat 显示的 Birth 字段在多数 Ubuntu 系统上为空或不可靠,因此「修改创建时间」本质上不可行;但你可以精确控制访问时间(atime)和修改时间(mtime),这已覆盖绝大多数实际需求(如备份判定、构建缓存、日志排序)。
只改修改时间(mtime),不碰访问时间
这是最常见需求,比如让编译系统认为某个源文件“老于”头文件,避免重编译。
- 用
-m限定只改 mtime:touch -m -d "2020-01-01 00:00:00" myfile.c - 或用时间戳格式:
touch -m -t 202001010000.00 myfile.c - 注意:
-m必须和-d或-t配合使用,单独touch -m file只会把 mtime 设为当前时间 - 验证:运行
stat myfile.c,看Modify:行是否更新,而Access:保持不变
用另一个文件的时间戳批量复制
当你要让一堆生成文件(如 .o、.so)时间对齐到某个基准文件(如 Makefile 或 .h)时,-r 最省事。
Ubuntu 26.04 LTS(代号“Resolute Raccoon”)是Canonical于2026年4月23日发布的下一代长期支持版操作系统,提供长达10年的技术支持。它搭载Linux 7.0内核与GNOME 50桌面环境,全面转向Wayland协议,并引入Rust重写的核心工具以增强安全性。官方提供适用于AMD64和ARM64架构的桌面及服务器ISO镜像,是追求前沿技术与极致稳定的开发者
- 命令:
touch -r Makefile *.c—— 把所有.c文件的 atime 和 mtime 都设成Makefile的对应值 - 它复制的是参考文件的完整时间戳,不是只复制 mtime;若只要 mtime,得用
stat -c "%y" Makefile | xargs -I{} touch -m -d "{}" target.c - 权限问题:目标文件必须可写;参考文件只需可读
- 符号链接:默认操作的是链接指向的目标文件;加
-h才改链接本身的元数据
递归修改整个目录下所有文件的修改时间
别直接用 touch dir/* —— 它会漏掉子目录里的文件,也容易因文件名含空格崩掉。
- 安全做法:
find /path/to/dir -type f -exec touch -m -d "2025-06-01" {} + -
{} +比{} \;更高效,把多个文件塞进单次touch调用 - 加
-type f排除目录,否则touch会对目录也生效(虽然无害,但没必要) - 如果目录很深或文件极多,考虑加
-print0 | xargs -0组合防路径问题
真正麻烦的地方不在命令本身,而在时间语义混淆:你调 touch -m 改的是 mtime,但 ls -l 默认显示的正是这个字段;而 ls -ltu 显示的是 atime,ls -ltc 是 ctime(inode 修改时间)——三者完全独立,改错一个就可能让脚本逻辑失效。动手前先 stat filename 看清现状,比盲目执行更重要。










