touch
是Linux和Unix系统中一个非常基础但实用的命令,主要用于操作文件的时间戳和创建空文件。下面我将详细介绍这个命令的用法和功能。
目录
一、基本功能
语法:touch [选项] 文件
功能:touch命令用于修改文件或目录的时间戳(包括访问时间和修改时间),也可用于创建新文件(当指定文件不存在时)。
1. 创建空文件
touch
命令最常见的用途是创建一个新的空文件:
touch filename.txt
- 如果
filename.txt
不存在,上述命令会创建一个名为filename.txt
的空文件; - 如果文件已存在,则会更新该文件的时间戳(使用stat指令查看文件时间)。
2. 同时创建多个文件
touch file1.txt file2.txt file3.txt
3. 创建带有空格的文件名(需要使用引号)
touch "new file.txt"
二、时间戳操作
touch
命令可以修改文件的三种时间戳(分别对应下图):
访问时间(atime):文件最后被读取的时间
修改时间(mtime):文件内容最后被修改的时间
更改时间(ctime):文件属性或内容最后被更改的时间
1. 修改文件的时间戳
touch filename.txt
如果文件已存在,
touch
会将上述三个时间戳更新为当前系统时间。如果文件不存在,
touch
会创建一个空文件,并设置所有时间戳为当前时间。
2. 只更新访问时间(-a选项)
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选项)
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)
示例:
touch -t 202301011200.30 filename.txt # 2023-01-01 12:00:30
touch -t 01231234 filename.txt # 当前年份的1月23日 12:34:00
影响的时间戳
默认情况下,
-t
同时修改atime
(访问时间)和mtime
(修改时间)。ctime
(更改时间)不受-t
控制,它会自动更新为命令执行时间(因为时间戳属于元数据)。
与
-a
或-m
结合使用如果只想修改
atime
或mtime
,可以组合使用:touch -a -t 202301011200.00 filename.txt # 仅修改 atime
touch -m -t 202301011200.00 filename.txt # 仅修改 mtime
常见用途
伪造文件时间(测试脚本或程序的时间敏感性)。
修复备份文件的时间戳(使其符合原始时间)。
强制触发构建工具(如
make
依赖mtime
判断文件是否过期)。批量调整文件时间(结合
find
使用)。
5. 使用参考文件的时间戳(-r选项)
touch -r mydir filename.txt
作用:这将使filename.txt的时间戳与mydir的时间戳相同。(使后者时间戳等于前者时间戳)
如下验证,ctime就不讨论了,它只能跟着系统走,不受影响:
三、高级用法
1. 创建大量文件
touch file{1..100}.txt
这将创建file1.txt到file100.txt共100个文件。(若之前存在同名文件,则不会创建该文件,只会创建新命名的文件,下面图片前后的文件1到3号就可以很好的说明这一点)
若想删除上面的大量文件,我们可以直接使用rm:
rm file{1..100}.txt
2. 防止文件被创建(-c选项)
如果只想更新时间戳而不想创建新文件:
touch -c filename.txt
如果文件不存在,不会创建新文件:
3. 设置精确的时间(包括纳秒)
touch -d "2023-01-01 12:00:00.123456789" file.txt
4. 处理符号链接
touch -h symlink
场景说明
默认情况下,touch
会跟随符号链接(symlink)并修改其目标文件的时间戳。如果想直接修改符号链接本身的时间戳(而非目标文件),需要使用 -h
选项。
操作步骤
创建一个符号链接
假设有一个文件original.txt
,并为其创建符号链接symlink_to_original
:echo "This is the original file" > original.txt ln -s original.txt symlink_to_original
查看原始时间戳
分别检查目标和符号链接的时间:stat original.txt stat symlink_to_original
输出示例(注意符号链接的
Access/Modify/Change
时间):修改符号链接本身的时间戳(不跟随目标)
使用-h
选项:touch -h -t 202301011200.00 symlink_to_original
验证结果
再次运行stat
:stat original.txt stat symlink_to_original
输出示例:
关键点
-h
的作用:
强制touch
操作作用于符号链接本身,而非其指向的目标文件。时间戳类型:
符号链接的atime/mtime
可被修改,但ctime
仍会因元数据变更而自动更新。默认行为对比:
不加-h
时,touch
会修改目标文件的时间戳(可能导致意外影响)。
典型用途
调试符号链接:
检查脚本是否正确处理符号链接的时间戳。备份系统:
保留符号链接的原始时间信息,而非目标文件的时间。文件同步工具:
确保工具(如rsync
)能识别符号链接本身的变更。
总结
命令 | 行为 |
---|---|
touch symlink |
修改目标文件的时间戳 |
touch -h symlink |
修改符号链接本身的时间戳 |
stat symlink |
默认显示目标文件时间,需用 stat -L 查看链接本身 |
通过 -h
选项,你可以精确控制符号链接的时间戳,避免影响其目标文件。
四、实际应用示例
快速创建测试文件:
touch test_{a..z}.txt
批量更新项目文件时间戳:
touch src/*.js
同步两个文件的时间戳:
touch -r source_file target_file
创建带有特定时间戳的日志文件:
touch -t 202212312359.59 year_end.log
注意事项
touch
命令需要你对目标目录有写权限才能创建或更新时间戳。时间戳修改可能会影响备份系统、构建系统等依赖文件时间的工具。
在某些系统上,
ctime
(状态更改时间)不能被直接修改,它会在文件属性或内容更改时自动更新。