Linux shell编程学习笔记48:touch命令

[复制链接]
发表于 2026-10-3 11:41:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

touch 命令到底在做什么

touch 是 Linux 最容易被低估的一条命令。它的本名并没有「创建文件」的意思,而是更新文件的时间戳。不过 GNU 的实现很贴心:如果指定的文件不存在,它会顺手帮你建一个空的同名文件。这也让 touch 成为脚本里「确保某文件存在」最常用的写法。

一个文件其实有两类时间:

  • atime(访问时间):文件被读取过就更新,对应 -a。
  • mtime(修改时间):文件内容被写入就更新,对应 -m。

如果你只是想让文件「看起来是新的」,别手动 rm 再 touch 重建——那样会连 inode 和权限一起丢掉,脚本里重建文件可能会打断正在读它的进程。

命令格式与帮助

touch [选项]... 文件或目录...

# 查看完整选项(GNU coreutils)
touch --help

touch --help 输出里有一句关键说明:A FILE argument that does not exist is created empty, unless -c or -h is supplied. 也就是「文件不存在时默认创建空文件」,除非你显式加了 -c 或 -h。

选项速查

选项作用
-a只改访问时间(atime)
-c / --no-create文件不存在时不要创建
-d / --date=STRING用字符串指定的时间代替当前时间
-f忽略,为兼容其他 Unix 保留
-h / --no-dereference改符号链接自身的时间戳,而不是它指向的文件
-m只改修改时间(mtime)
-r / --reference=FILE以某个文件的时间作为基准
-t STAMP按 [[CC]YY]MMDDhhmm[.ss] 格式设定时间
--time=WORDaccess/atime/use 等于 -a,modify/mtime 等于 -m
--help / --version帮助 / 版本信息

-d 和 -t 接受的时间格式不一样:-d 吃人类可读的「2020-02-20 12:20」,-t 只吃数字紧凑串。别混用。

实例 1:创建空文件

~/test$ ls -l
total 0
~/test$ touch 1.txt
~/test$ ls -l
total 0
-rw-rw-r-- 1 csdn csdn 0 5月 22 22:26 1.txt

先用 ls -l 确认 ~/test 是空的,然后执行 touch 1.txt——因为 1.txt 不存在,touch 直接替你创建好了。

实例 2:-c 只更新时间,不新建

~/test$ ls -l
total 0
-rw-rw-r-- 1 csdn csdn 0 5月 22 22:26 1.txt
~/test$ touch -c 1.txt 2.txt
~/test$ ls -l
total 0
-rw-rw-r-- 1 csdn csdn 0 5月 22 22:41 1.txt

注意 1.txt 的时间从 22:26 跳到了 22:41,而 2.txt 既不存在也没被创建——这就是 -c 的效果。脚本里做「只刷新已存在文件」时一定要加它,否则每次跑都会多出一堆空文件。

实例 3:用 -d 指定任意时间

~/test$ touch -d "2020-02-20 12:20" 2.txt
~/test$ ls -l
total 0
-rw-rw-r-- 1 csdn csdn 0 5月 22 59 1.txt
-rw-rw-r-- 1 csdn csdn 0 2月 20  2020 2.txt
~/test$ stat 2.txt
  File: '2.txt'
  Size: 0           Blocks: 0          IOBlock: 4096 regular empty file
Device: 4ch/76d    Inode: 1714885     Links: 1
Access: (0664/-rw-rw-r--)  Uid: (1000/csdn)  Gid: (1000/csdn)
Access: 2020-02-20 12:20:00.000000000 +0800
Modify: 2020-02-20 12:20:00.000000000 +0800
Change: 2024-05-02 23:15:34.397217850 +0800

-d 用的是字符串日期,看着最直观。stat 能看到三个时间:Access、Modify 都被我们改成了 2020 年,Change(inode 变更时间)改不了,那是内核记账的。想验证时间是否真的写进去了,stat 比 ls -l 准。

实例 4:用 -r 复制别人的时间

~/test$ ls -l
total 0
-rw-rw-r-- 1 csdn csdn 0 5月 22 59 1.txt
-rw-rw-r-- 1 csdn csdn 0 2月 20  2020 2.txt
~/test$ touch -r 2.txt 1.txt
~/test$ ls -l
total 0
-rw-rw-r-- 1 csdn csdn 0 2月 20  2020 1.txt
-rw-rw-r-- 1 csdn csdn 0 2月 20  2020 2.txt

touch -r 2.txt 1.txt 的意思是「拿 2.txt 的时间当模板,套到 1.txt 上」。做批量文件归档、按时间排序还原时,这招比一条条 -d 拼字符串省事得多。

几个容易被忽略的点

  • atime 会自己变:你刚 -a 改完,一读文件又被刷新了。要看真实改动记录,盯 Modify 那一行。
  • 要写权限:touch 改的是文件元信息,你对它所在目录必须有写权限,否则报 Permission denied。
  • 时间戳不是唯一标识:把时间改成过去,很多构建缓存、增量同步工具(rsync、make)照样会按 mtime 判断,但建议同时确认 Change 没被动过。
  • 别用 rm 重建来「刷新」:直接 touch 保留 inode,对正在被写入的日志日志、守护进程持有的文件更友好。

小结

touch 的三件套用法记牢就够日常用了:创建空文件直接 touch file;只刷新已存在文件加 -c;还原时间用 -d(人读)或 -r(拷别人的)。剩下的 -a/-m/-h 按场景取用。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表