Linux基本指令篇 —— touch指令

touchLinux和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:

  1. 修改文件内容(影响 mtime,同时触发 ctime 更新)。

  2. 修改文件元数据(如权限、所有者、硬链接数等)。

  3. 更新访问时间 atime (因为 atime 本身是元数据的一部分)。

当你运行 touch -a 时:

  • 系统需要更新文件的 atime,而 atime 是存储在文件元数据中的。

  • 修改元数据会导致 ctime 被内核自动更新(这是不可阻止的行为)。

关键结论

  • ctime 不受 touch 命令的直接控制它由内核维护,任何对文件内容或元数据的修改都会更新它。

  • 即使你只更新 atime(元数据的一部分),也会触发 ctime 的更新。

  • 所以我们同理可得,下面的只更新修改时间也是会更改ctime的,理解了上面的原理之后,我们就理解了为什么ctime会跟着修改了。

3. 只更新修改时间(-m选项)

bash 复制代码
touch -m filename.txt

果然不出所料,ctime也跟着修改了,验证了上面所说的结论:

4. 指定特定的时间戳

-ttouch 命令的一个选项,用于 手动指定文件的时间戳 (而非使用当前系统时间)。它的作用是精确控制文件的 访问时间(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 结合使用

  • 如果只想修改 atimemtime,可以组合使用:

    bash 复制代码
    touch -a -t 202301011200.00 filename.txt  # 仅修改 atime
    bash 复制代码
    touch -m -t 202301011200.00 filename.txt  # 仅修改 mtime

常见用途

  1. 伪造文件时间(测试脚本或程序的时间敏感性)。

  2. 修复备份文件的时间戳(使其符合原始时间)。

  3. 强制触发构建工具 (如 make 依赖 mtime 判断文件是否过期)。

  4. 批量调整文件时间 (结合 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 选项。


操作步骤

  1. 创建一个符号链接

    假设有一个文件 original.txt,并为其创建符号链接 symlink_to_original

    bash 复制代码
    echo "This is the original file" > original.txt
    ln -s original.txt symlink_to_original
  2. 查看原始时间戳

    分别检查目标和符号链接的时间:

    bash 复制代码
    stat original.txt
    stat symlink_to_original

    输出示例(注意符号链接的 Access/Modify/Change 时间):

  3. 修改符号链接本身的时间戳(不跟随目标)

    使用 -h 选项:

    bash 复制代码
    touch -h -t 202301011200.00 symlink_to_original
  4. 验证结果

    再次运行 stat

    bash 复制代码
    stat original.txt
    stat symlink_to_original

    输出示例:

关键点

  • -h 的作用

    强制 touch 操作作用于符号链接本身,而非其指向的目标文件。

  • 时间戳类型

    符号链接的 atime/mtime 可被修改,但 ctime 仍会因元数据变更而自动更新。

  • 默认行为对比

    不加 -h 时,touch 会修改目标文件的时间戳(可能导致意外影响)。

典型用途

  1. 调试符号链接

    检查脚本是否正确处理符号链接的时间戳。

  2. 备份系统

    保留符号链接的原始时间信息,而非目标文件的时间。

  3. 文件同步工具

    确保工具(如 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

注意事项

  1. touch命令需要你对目标目录有写权限才能创建或更新时间戳。

  2. 时间戳修改可能会影响备份系统、构建系统等依赖文件时间的工具。

  3. 在某些系统上,ctime(状态更改时间)不能被直接修改,它会在文件属性或内容更改时自动更新。

相关推荐
黑客飓风17 分钟前
Ubuntu崩溃修复大赛的技术文章大纲
linux·运维·ubuntu
2401_853275731 小时前
Sentinel实现原理
服务器·网络·sentinel
189228048611 小时前
NW849NX721美光固态闪存NX745NX751
大数据·服务器·科技
小天源2 小时前
Devops中docker安装配置
运维·docker·devops
楼台的春风2 小时前
【Linux驱动开发 ---- 4_驱动开发框架和 API】
linux·c语言·c++·人工智能·驱动开发·嵌入式硬件·ubuntu
tianyuanwo2 小时前
基于RISC-V架构的服务器OS构建DevOps体系的全方位方案
服务器·架构·risc-v
gohacker2 小时前
Python 自动化运维与DevOps实践
运维·python·自动化
楼台的春风2 小时前
【Linux驱动开发 ---- 1.1_Linux 基础操作入门】
linux·c语言·c++·人工智能·驱动开发·嵌入式硬件·ubuntu
新时代牛马5 小时前
OpenSSL引擎 + PKCS11 + SoftHSM2认证
linux
皓月盈江6 小时前
国产Linux银河麒麟操作系统安装开源免费Draw.io(diagrams.net)替代Visio
linux·ubuntu·开源·draw.io·visio·银河麒麟操作系统·diagrams.net