`touch` 命令的合法用途是什么?

Quo*_*ans 83 timestamps command touch

什么是点touch命令?我知道我可以用它创建空文件,但echo -n.

否则,为什么有人需要更改文件的时间戳?除非造成关于文件年龄的错误印象,否则我看不到任何其他用途,而且这不是合法用途(从我的角度来看)。

cas*_*sey 97

的一个优点touch是它可以指定任意时间戳,而echo -n总是导致当前时间。

合法使用的一个例子是更新源代码文件的时间戳,这样程序make就会认为源文件比它的编译对象更新并重建它。

其他用途是创建仅基于文件存在而起作用的文件,例如/etc/nologin,如果存在则不允许登录。我还认为这touch myfile是一个比 更简单的构造echo -n >> myfile,并且输入时间更短。

  • 另一个常见用途:将文件触摸到特定日期,然后“查找 / -newer /the/file”以查找在它之后更改/创建的所有文件 (18认同)
  • 这不起作用:打开现有文件进行输出,但不写入文件,不会更改 mtime(无论如何在我的系统上)。即使是这样,您也不需要也不应该将 `echo -n` 用于什么都不做的命令。`echo -n` 在某些 shell 下可能会输出字符串“-n”。如果你真的需要一个什么都不做的命令,`:` 或 `true` 是更好的选择,但 `>> myfile` 本身也是创建文件的一种完全有效的方式,如果它不存在的话。当然,所有这些都支持您的答案,即您应该只使用“触摸”。 (6认同)
  • @Geek `echo -n` 将输出一个空字符串,它本身什么都不做。通过 `>>` 重定向其输出会导致空输出附加到文件中。如果文件不存在,重定向将导致创建该文件。 (3认同)

JRF*_*son 39

底层系统调用 ( utime) 对于各种实用程序很重要,例如tar能够设置新复制(未压缩)文件的时间戳。还可以选择某些备份实用程序来重置它们复制的文件的上次访问时间。

一种合法用途touch是创建具有特定时间戳的文件。这样的“参考”文件可以被诸如find. 例如,查找比 2013 年 11 月 1 日(即 2013/11/01)最近修改的所有文件”

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +
Run Code Online (Sandbox Code Playgroud)

  • @Geek 通过查看数字并注意第一部分“20131101”可以分解为“2013-11-01”或 2013 年 11 月 1 日。然后您可以假设“0000”部分表示特定的一天中的时间,在本例中为 00 小时 00 分钟。或者,您可以查看“touch”的手册页,它会准确地告诉您格式是什么(参见“-t”)。 (4认同)

slm*_*slm 38

touch命令的主要目的是操作文件的时间戳和创建文件。

例子

1. 创建文件

$ ls -l
total 0

$ touch file{1..3}

$ ls -l
total 0
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file1
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file2
-rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file3
Run Code Online (Sandbox Code Playgroud)

注意:total 0从的输出ls -l是正确的。此实现ls显示了文件在列出时使用的块数。您可以通过将-s开关添加到ls. 这将列出每个文件使用的块。在这里,我向文件 1 和文件 2 添加了 2 个字符。

例子

$ ls -ls
total 8
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:07 file1
4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:09 file2
0 -rw-rw-r--. 1 saml saml 0 Jan 13 12:05 file3
Run Code Online (Sandbox Code Playgroud)

2. 文件的时间/日期信息 - stat 命令

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2014-01-12 13:33:38.279456149 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:33:38.279456149 -0500
 Birth: -
Run Code Online (Sandbox Code Playgroud)

我们可以touch用来操作给定文件上的各种时间戳。

3. 摘自触摸手册页

   -a     change only the access time
   -m     change only the modification time
   -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time
Run Code Online (Sandbox Code Playgroud)

4. 操纵访问时间

$ touch -a -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2014-01-12 13:33:38.279456149 -0500
Change: 2014-01-12 13:38:52.023434696 -0500
 Birth: -
Run Code Online (Sandbox Code Playgroud)

5.操纵修改时间

$ touch -m -t200001010000 file1

$ stat file1
  File: ‘file1’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd02h/64770d    Inode: 11403667    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    saml)   Gid: ( 1000/    saml)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2000-01-01 00:00:00.000000000 -0500
Modify: 2000-01-01 00:00:00.000000000 -0500
Change: 2014-01-12 13:39:31.060432026 -0500
 Birth: -
Run Code Online (Sandbox Code Playgroud)

您可能想知道更改时间 (ctime)。不能使用touch. 它跟踪任何元数据在文件上被触及的时间。有关更多详细信息,请参阅此 U&L 问答,标题为:您可以在不触发“更改”时间戳的情况下对文件做什么?.

  • @QuoraFea - 我的回答是为了您的利益以及将来遇到它的用户。请不要假设答案纯粹是为了你,如果我以任何方式冒犯了你,我很抱歉,这不是我的本意,我只是试图解释时间如何运作的基础。 (16认同)

LSe*_*rni 20

除了你得到的另外两个非常好的答案之外,用你的话来说,还有一个用途是

制造关于文件年龄的错误印象

例如用于备份方案。您可能不想用较新的备份更新备份,因为它们是相同的,或者因为与更新备份的费用相比,更改无关紧要,例如,到远程主机的慢速线路。要实现这一点,您可以选择使用较新的时间戳标记备份文件,这不是伪造而是声明该文件的有效时间戳现在是不同的。

现在对文件年龄的印象确实是错误的,但其含义是真实的和合法的。


kes*_*lam 20

最常见的用途之一touch是——或者至少曾经是——触发代码的重建。

通常的构建工具——make及其衍生工具——尝试通过不重新编译/重建文件来保存工作,除非创建它们的文件之一发生了变化——例如,如果 .o 文件比 .c 更新源代码,通常可以安全地假设 C 源代码自被编译以生成该目标文件后没有更改。

但有时您想强制重建某些东西。您可以对其源文件之一进行不必要的修改,但这可能会意外损坏某些内容。相反,您可以简单地创建touch文件,使其看起来很新,而不会有任何更改其内容的风险——这足以说服make现在是重建依赖于该文件的所有内容的时候了。

还有其他用途,但从历史上看,这是最大的用途。


mil*_*ose 12

我至少使用过一个 web 框架(不记得是哪个),它在开发模式下查看源代码文件的更改并在发生更改时重新加载应用程序。

当然,有时您希望它在更改它没有看到的内容后重新加载,在这种情况下,touch它的主要配置文件就可以解决问题。

因此,在一般情况下,只要您想启动由文件更改触发的进程,而无需实际更改文件。

  • 这实际上是 mod_wsgi 和 apache 的情况;您可以通过触摸 wsgi 文件重新加载,例如,django web 应用程序。 (4认同)

sas*_*rsl 11

合法使用触摸:

  • 将图像文件(GIF/JPG/etc)的时间戳更新为它们被拍摄的时间。并非所有渲染器都会阅读或注意 EXIF 信息。
  • 在批量更新一组文件时保留 c/m 时间,其中时间戳对文件包很重要。
  • 如果您需要在失败后再次导入,请设置批处理(即 CSV)文件的时间,导入程序取决于时间戳(将该讨论留给另一个主题:-))
  • 存档目的,即根据年份在文件夹中进行备份,然后将这些文件夹上的时间设置为 Jan 1 YYYY 以便于排序
  • 更新程序锁定文件以表示它已被重新加载。
  • 设置您的应用程序监视的“轮询文件”。在轮询文件日期更改时执行操作。


Kev*_*gan 7

一种用途是更正未正确设置的文件的时间戳。

例如,大多数复制文件的方式(以及可能移动文件的某些方式)都会导致新文件具有当前时间的时间戳,而不是原始文件的时间戳。

通常,这不是我们想要的。触摸可以“解决”这个问题。

另一个用途是通过将文件时间戳恢复到“编辑...撤消编辑”操作之前的状态来反映已撤消的文件修改。

  • 的确。经过一段时间,我发现 `alias cp='cp --preserve=timestamps'` 更适合我在 PC 领域...... (2认同)

小智 5

things喜欢echo(或者> file其他人提到的更好)的一个重要区别是触摸不会粉碎内容。> file将清空文件。touch将不会。不要想着避免内容损坏的技巧,只需使用触摸!无论如何,它会在内核中做更少的工作,因为它只会处理文件的属性,而不会浪费时间实际准备打开然后执行关闭。

即使文件当前处于强制或建议锁定或独占打开状态,触摸也可能会更改时间戳。嗯,从来没有测试过或阅读过它......

  • `>>` 将追加而不是覆盖 (2认同)