touch是Linux及类Unix系统自带的命令行工具,用于创建空文件或更新文件的访问时间(atime)和修改时间(mtime),不修改ctime,无需安装。
touch 不是某个叫 “Touch Linux” 的发行版,也不是需要“安装”的独立软件——它是几乎所有 Linux 和类 Unix 系统(包括 macOS)自带的命令行工具,无需额外安装。
如果你在终端里输入 touch --version 能看到输出(比如 touch (GNU coreutils) 9.4),说明它已就位;如果提示 command not found,那大概率是你用的极简容器或嵌入式系统删掉了 coreutils,此时应重装 coreutils 包,而不是找什么“Touch Linux”。
如何用 touch 创建空白文件
最常用也最容易误解的用法:直接 touch filename。
- 如果
filename不存在,touch会创建一个大小为 0 字节的空文件 - 如果
filename已存在,touch不会报错,但会把它的atime(访问时间)和mtime(修改时间)都更新为当前系统时间 - 不支持递归创建父目录;若路径中目录不存在(如
logs/app.log而logs/不存在),会报错No such file or directory,此时得先用mkdir -p logs
常见错误现象:
执行 touch /tmp/data.csv 却提示权限拒绝?不是 touch 问题,而是你对 /tmp 下该路径无写权限(比如被 noexec 或 nosuid 挂载选项限制,或 SELinux 策略拦截)。
如何用 touch 修改文件的访问时间或修改时间
touch 默认同时改 atime 和 mtime,但多数场景需要分离控制。
- 只更新访问时间:
touch -a filename - 只更新修改时间:
touch -m filename - 同时指定时间并只改其中一项:
touch -a -d "2024-01-01 09:00" filename - 注意:
ctime(状态变更时间)无法通过touch手动设置——它由内核自动维护,只要文件元数据(权限、所有者、xattr 等)或内容发生任何变更,ctime就会刷新
性能影响:
CentOS Linux 7.9.2009
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
下载
频繁用 -a 更新 atime 可能带来 I/O 开销(尤其机械盘或 NFS)。现代系统常默认启用 relatime 或 noatime 挂载选项来缓解,此时 touch -a 仍有效,但普通读取不会触发 atime 更新。
如何用 touch 批量设时间戳或复制参考时间
批量操作依赖通配符或脚本,但要注意 shell 展开时机和错误处理。
- 把当前目录下所有
.log文件时间统一设为昨天:touch -d "yesterday" *.log - 用参考文件
template.conf的时间戳覆盖一批配置文件:touch -r template.conf app.conf nginx.conf - 若参考文件时间本身不合法(比如是未来时间或纳秒级精度),目标文件时间也会继承该值,
stat可验证:stat app.conf | grep -E "(Access|Modify)" -
-t和-d参数不能混用;-t格式严格(如202605271849.00),-d更灵活(支持"3 hours ago"、"next Friday"),但解析依赖系统 locale 和 GNUdate实现
容易踩的坑:
在脚本中用 touch -d "$VAR" file,若 $VAR 为空或含空格未加引号,会导致命令失败或误创建文件;务必写成 touch -d "$VAR" file 并确保 $VAR 非空。
touch 看似简单,真正难的是理解它不做什么:它不改 ctime,不建目录,不处理硬链接的 inode 时间一致性,也不绕过文件系统挂载选项(如 noatime 对 -a 的实际效果限制)。用之前先 stat 看一眼原始时间,改完再 stat 对比,比背参数更可靠。
