马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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=WORD | access/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企服评测-应用市场 编辑提示 |