touch
是Linux和Unix系统 中一个非常基础但实用的命令,主要用于操作文件的时间戳和创建空文件。下面我将详细介绍这个命令的用法和功能。
目录
[1. 创建空文件](#1. 创建空文件)
[2. 同时创建多个文件](#2. 同时创建多个文件)
[3. 创建带有空格的文件名(需要使用引号)](#3. 创建带有空格的文件名(需要使用引号))
[1. 修改文件的时间戳](#1. 修改文件的时间戳)
[2. 只更新访问时间(-a选项)](#2. 只更新访问时间(-a选项))
[3. 只更新修改时间(-m选项)](#3. 只更新修改时间(-m选项))
[4. 指定特定的时间戳](#4. 指定特定的时间戳)
[-t 选项的作用](#-t 选项的作用)
[与 -a 或 -m 结合使用](#与 -a 或 -m 结合使用)
[5. 使用参考文件的时间戳(-r选项)](#5. 使用参考文件的时间戳(-r选项))
[1. 创建大量文件](#1. 创建大量文件)
[2. 防止文件被创建(-c选项)](#2. 防止文件被创建(-c选项))
[3. 设置精确的时间(包括纳秒)](#3. 设置精确的时间(包括纳秒))
[4. 处理符号链接](#4. 处理符号链接)
一、基本功能
语法:touch [选项] 文件
**功能:**touch命令用于修改文件或目录的时间戳(包括访问时间和修改时间),也可用于创建新文件(当指定文件不存在时)。
1. 创建空文件
touch
命令最常见的用途是创建一个新的空文件:
bash
touch filename.txt
-
如果
filename.txt
不存在,上述命令会创建一个名为filename.txt
的空文件; -
如果文件已存在,则会更新该文件的时间戳**(使用stat指令查看文件时间)**。
2. 同时创建多个文件
bash
touch file1.txt file2.txt file3.txt

3. 创建带有空格的文件名(需要使用引号)
bash
touch "new file.txt"

二、时间戳操作
touch
命令可以修改文件的三种时间戳(分别对应下图):
-
**访问时间(atime):**文件最后被读取的时间
-
**修改时间(mtime):**文件内容最后被修改的时间
-
**更改时间(ctime):**文件属性或内容最后被更改的时间

1. 修改文件的时间戳
bash
touch filename.txt
-
如果文件已存在 ,
touch
会将上述三个时间戳更新为当前系统时间。 -
如果文件不存在 ,
touch
会创建一个空文件,并设置所有时间戳为当前时间。
2. 只更新访问时间(-a选项)
bash
touch -a filename.txt
但事实真的只更改访问时间吗?请看验证后的效果,如下:
我们发现,我们原本只想改变访问时间atime,但是更改时间ctime也被改变了?为什么会出现这样的情况呢?思考一下:
ctime(Change Time) 并非指文件内容 的修改时间,而是指文件**元数据(metadata)**的变更时间。以下操作会更新 ctime:
-
修改文件内容(影响
mtime
,同时触发ctime
更新)。 -
修改文件元数据(如权限、所有者、硬链接数等)。
-
更新访问时间
atime
(因为atime
本身是元数据的一部分)。
当你运行 touch -a
时:
-
系统需要更新文件的
atime
,而atime
是存储在文件元数据中的。 -
修改元数据会导致
ctime
被内核自动更新(这是不可阻止的行为)。
关键结论
-
ctime
不受touch
命令的直接控制 ,它由内核维护,任何对文件内容或元数据的修改都会更新它。 -
即使你只更新
atime
(元数据的一部分),也会触发ctime
的更新。 -
所以我们同理可得,下面的只更新修改时间也是会更改ctime的,理解了上面的原理之后,我们就理解了为什么ctime会跟着修改了。
3. 只更新修改时间(-m选项)
bash
touch -m filename.txt
果然不出所料,ctime也跟着修改了,验证了上面所说的结论:

4. 指定特定的时间戳
-t
是 touch
命令的一个选项,用于 手动指定文件的时间戳 (而非使用当前系统时间)。它的作用是精确控制文件的 访问时间(atime) 和 修改时间(mtime) ,通常用于测试、归档或修复文件时间。
-t
选项的作用
手动设置时间戳
-
默认情况下,
touch
使用当前时间,但-t
允许自定义时间。 -
格式:
[[CC]YY]MMDDhhmm[.ss]
-
CC
:世纪(可选,如20
表示 2000 年) -
YY
:年份后两位(如23
表示 2023) -
MM
:月份(01-12) -
DD
:日期(01-31) -
hh
:小时(00-23) -
mm
:分钟(00-59) -
.ss
:秒(可选,00-59)
-
示例:
bash
touch -t 202301011200.30 filename.txt # 2023-01-01 12:00:30

bash
touch -t 01231234 filename.txt # 当前年份的1月23日 12:34:00
2.
影响的时间戳
-
默认情况下,
-t
同时修改atime
(访问时间)和mtime
(修改时间)。 -
ctime
(更改时间)不受-t
控制,它会自动更新为命令执行时间(因为时间戳属于元数据)。
与 -a
或 -m
结合使用
-
如果只想修改
atime
或mtime
,可以组合使用:bashtouch -a -t 202301011200.00 filename.txt # 仅修改 atime
bashtouch -m -t 202301011200.00 filename.txt # 仅修改 mtime
常见用途
-
伪造文件时间(测试脚本或程序的时间敏感性)。
-
修复备份文件的时间戳(使其符合原始时间)。
-
强制触发构建工具 (如
make
依赖mtime
判断文件是否过期)。 -
批量调整文件时间 (结合
find
使用)。
5. 使用参考文件的时间戳(-r选项)
bash
touch -r mydir filename.txt
作用: 这将使filename.txt的时间戳与mydir的时间戳相同。(使后者时间戳等于前者时间戳)
如下验证,ctime就不讨论了,它只能跟着系统走,不受影响:

三、高级用法
1. 创建大量文件
bash
touch file{1..100}.txt
这将创建file1.txt到file100.txt共100个文件。(若之前存在同名文件,则不会创建该文件,只会创建新命名的文件,下面图片前后的文件1到3号就可以很好的说明这一点)

若想删除上面的大量文件,我们可以直接使用rm:
bash
rm file{1..100}.txt

2. 防止文件被创建(-c选项)
如果只想更新时间戳而不想创建新文件:
bash
touch -c filename.txt

如果文件不存在,不会创建新文件:

3. 设置精确的时间(包括纳秒)
bash
touch -d "2023-01-01 12:00:00.123456789" file.txt

4. 处理符号链接
bash
touch -h symlink
场景说明
默认情况下,touch
会跟随符号链接(symlink)并修改其目标文件 的时间戳。如果想直接修改符号链接本身 的时间戳(而非目标文件),需要使用 -h
选项。
操作步骤
-
创建一个符号链接
假设有一个文件
original.txt
,并为其创建符号链接symlink_to_original
:bashecho "This is the original file" > original.txt ln -s original.txt symlink_to_original
-
查看原始时间戳
分别检查目标和符号链接的时间:
bashstat original.txt stat symlink_to_original
输出示例(注意符号链接的
Access/Modify/Change
时间): -
修改符号链接本身的时间戳(不跟随目标)
使用
-h
选项:bashtouch -h -t 202301011200.00 symlink_to_original
-
验证结果
再次运行
stat
:bashstat original.txt stat symlink_to_original
输出示例:
关键点
-
-h
的作用 :强制
touch
操作作用于符号链接本身,而非其指向的目标文件。 -
时间戳类型 :
符号链接的
atime/mtime
可被修改,但ctime
仍会因元数据变更而自动更新。 -
默认行为对比 :
不加
-h
时,touch
会修改目标文件的时间戳(可能导致意外影响)。
典型用途
-
调试符号链接 :
检查脚本是否正确处理符号链接的时间戳。
-
备份系统 :
保留符号链接的原始时间信息,而非目标文件的时间。
-
文件同步工具 :
确保工具(如
rsync
)能识别符号链接本身的变更。
总结
命令 | 行为 |
---|---|
touch symlink |
修改目标文件的时间戳 |
touch -h symlink |
修改符号链接本身的时间戳 |
stat symlink |
默认显示目标文件时间,需用 stat -L 查看链接本身 |
通过 -h
选项,你可以精确控制符号链接的时间戳,避免影响其目标文件。
四、实际应用示例
快速创建测试文件:
bash
touch test_{a..z}.txt
批量更新项目文件时间戳:
bash
touch src/*.js
同步两个文件的时间戳:
bash
touch -r source_file target_file
创建带有特定时间戳的日志文件:
bash
touch -t 202212312359.59 year_end.log
注意事项
-
touch
命令需要你对目标目录有写权限才能创建或更新时间戳。 -
时间戳修改可能会影响备份系统、构建系统等依赖文件时间的工具。
-
在某些系统上,
ctime
(状态更改时间)不能被直接修改,它会在文件属性或内容更改时自动更新。