1. 概述
在本教程中,我们将学习touch命令。简而言之,这个命令允许我们更新文件或目录的最后修改时间和最后访问时间。
因此,我们将重点关注如何使用该命令及其各种选项。
请注意,我们使用 Bash 测试了此处显示的所有命令;但是,它们应该与任何兼容 POSIX 的 shell 一起使用。
2. 默认行为
通过执行touch,文件系统上的一个或多个文件或目录将被更新,以便将它们的上次修改时间和上次访问时间设置为当前系统时间。
那么,假设今天的日期是 2020 年 2 月 1 日,时间是上午 7:00。
如上所述,该命令将更新example-file.txt文件的两个时间戳:
# ls -l example-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 1 20:00 example-file.txt
# touch example-file.txt
# ls -l example-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Feb 1 07:00 example-file.txt复制
2.1. 创建新文件
此外,当指定的文件不存在时,该命令将创建一个空文件并相应地设置时间:
# ls -l sample-file.txt
ls: sample-file.txt: No such file or directory
# touch sample-file.txt
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Feb 1 07:00 sample-file.txt复制
如果创建新文件,则新创建文件的权限将默认为给定文件系统的标准权限。
2.2. 具有多个文件或目录
如果指定了多个文件或目录,该命令将更新所有文件或目录的时间戳:
# ls -l example-file.txt sample-file.txt example-dir
drw-r--r-- 1 baeldung baeldung 0 Jan 1 22:00 example-dir
-rw-r--r-- 1 baeldung baeldung 0 Jan 1 20:00 example-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 1 16:00 sample-file.txt
# touch example-file.txt sample-file.txt example-dir
# ls -l example-file.txt sample-file.txt example-dir
drw-r--r-- 1 baeldung baeldung 0 Feb 1 07:00 example-dir
-rw-r--r-- 1 baeldung baeldung 0 Feb 1 07:00 example-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Feb 1 07:00 sample-file.txt复制
3. 定义具体时间
或者,我们可以使用-t选项定义要设置的时间戳。因此,这会更改使用系统时间的默认行为,而是使用选项设置指定的时间。使用此选项指定时间的格式为“ [[CC]YY]MMDDhhmm[.SS] ”:
- CC:世纪
- YY:年份的后两位数字;如果指定了YY ,但未指定 CC ,则 69 到 99 之间的 YY值将导致CC值为 19;否则,使用CC值 20
- MM : 一年中的月份 (01-12)
- DD : 一个月中的哪一天 (01-31)
- hh:一天中的小时 (00-23)
- mm:一小时中的分钟 (00-59)
- SS : 分钟的第二个 (00-59)
因此,要使用我们定义的时间戳更新文件或目录,我们可以执行:
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 20 19:00 sample-file.txt
# touch -t 202001262359.59 sample-file.txt
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 26 23:59 sample-file.txt
复制
当未指定CC和YY时,它们默认为当前年份:
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 20 19:00 sample-file.txt
# touch -t 01282359.59 sample-file.txt
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 28 23:59 sample-file.txt复制
如果未指定SS ,则该值默认为 0。
4. 调整时间
默认行为的另一种替代方法是相对更改时间,而不是显式设置或使用系统时间。使用*-A*允许我们调整文件或目录相对于其当前时间戳的时间戳。用于指定时间调整的格式为“ [-][[hh]mm]SS ”:
- -:使调整为负值
- hh : 小时数 (00-99)
- mm : 分钟数 (00-59)
- SS : 秒数 (00-59)
因此,要将访问时间调整-25小时,我们执行:
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 27 22:59 sample-file.txt
# touch -A -250000 sample-file.txt
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 26 21:59 sample-file.txt复制
5. 其他选项
5.1. 使用参考文件中的时间戳
-r选项使用指定参考文件中的时间戳作为更新时使用的时间戳。在这里,使用-r运行命令会获取example-file.txt中的时间戳并将其应用到example-file.txt:
# ls -l example-file.txt sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Feb 1 17:00 example-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 23 22:45 sample-file.txt
# touch -r example-file.txt sample-file.txt
# ls -l example-file.txt sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Feb 1 17:00 example-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Feb 1 17:00 sample-file.txt复制
5.2. 使用符号链接
如果我们对文件或目录的符号链接执行该命令,则链接目标的时间戳会更新:
# ls -l example-file.txt link-to-example-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 23 22:00 example-file.txt
lrw-r--r-- 1 baeldung baeldung 0 Jan 23 22:30 link-to-example-file.txt -> example-file.txt
# touch example-file-link.txt
# ls -l example-file.txt link-to-example-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Feb 1 07:00 example-file.txt
lrw-r--r-- 1 baeldung baeldung 0 Jan 23 22:30 link-to-example-file.txt -> example-file.txt复制
使用*-h*,我们可以更新目标文件或目录的符号链接的时间戳,而不是目标本身。
5.3. 防止文件创建
我们可以使用*-c*禁用文件创建。使用此选项执行时,如果文件不存在,则该命令不执行任何操作:
# ls -l sample-file.txt
ls: sample-file.txt: No such file or directory
# touch -c sample-file.txt
# ls -l sample-file.txt
ls: sample-file.txt: No such file or directory复制
5.4. 仅更新上次访问时间
如果我们只想更新文件或目录的上次访问时间,我们可以使用*-a*选项:
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 20 19:00 sample-file.txt
# ls -l -u sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 20 19:00 sample-file.txt
# touch -a sample-file.txt
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 20 19:00 sample-file.txt
# ls -l -u sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Feb 1 07:00 sample-file.txt
复制
如前所述,默认行为是更新上次访问时间和上次修改时间。使用此选项会覆盖设置两个时间戳的默认行为。一起使用 -a 和 -m 会导致更新两个时间戳的默认行为。
5.5. 仅更新上次修改时间
同样,如果我们只想更新文件或目录的最后修改时间,我们可以使用*-m* 选项:
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 20 19:00 sample-file.txt
# ls -l -u sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 20 19:00 sample-file.txt
# touch -m sample-file.txt
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Feb 1 07:00 sample-file.txt
# ls -l -u sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 20 19:00 sample-file.txt
复制
6. 兼容性
为了保持与旧版 BSD 系统上触摸的向后兼容性,仍然支持一些过时的功能和选项。
它允许我们首先以“ MMDDhhmm[YY] ”格式指定时间格式,后跟要在文件系统上更新的文件或目录的名称。
MM 、DD、hh和mm字母对的处理方式与*-t选项指定的对应* 字母对相同。如果YY介于 39 和 99 之间,则年份为 20 世纪。否则,年份为 21 世纪:
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Feb 10 12:00 sample-file.txt
# touch 0123000020 sample-file.txt
# ls -l sample-file.txt
-rw-r--r-- 1 baeldung baeldung 0 Jan 23 00:00 sample-file.txt
复制
该命令曾经能够使用*-f*选项强制更新文件。然而,这个选项现在被忽略了。
七、结论
在本文中,我们探讨了touch命令行实用程序、其各种选项及其向后兼容性。
总之,当我们不需要对文件进行任何更改,但我们想要更新其上次访问或上次修改时间时,触摸会很方便。