touch是Linux和Unix系统中一个非常基础但实用的命令,主要用于操作文件的时间戳和创建空文件。下面我将详细介绍这个命令的用法和功能。
目录
一、基本功能
1. 创建空文件
2. 同时创建多个文件
3. 创建带有空格的文件名(需要使用引号)
二、时间戳操作
1. 修改文件的时间戳
2. 只更新访问时间(-a选项)
关键结论
3. 只更新修改时间(-m选项)
4. 指定特定的时间戳
-t 选项的作用
手动设置时间戳
示例:
影响的时间戳
与 -a 或 -m 结合使用
常见用途
5. 使用参考文件的时间戳(-r选项)
三、高级用法
1. 创建大量文件
2. 防止文件被创建(-c选项)
3. 设置精确的时间(包括纳秒)
4. 处理符号链接
场景说明
操作步骤
关键点
典型用途
总结
四、实际应用示例
快速创建测试文件:
批量更新项目文件时间戳:
同步两个文件的时间戳:
创建带有特定时间戳的日志文件:
注意事项
一、基本功能
语法: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(状态更改时间)不能被直接修改,它会在文件属性或内容更改时自动更新。

















![[AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)](https://i-blog.csdnimg.cn/direct/94e97f54c91d4f3b9b7b735451200a7c.png)

