Quo*_*ans 83 timestamps command touch
什么是点touch命令?我知道我可以用它创建空文件,但echo -n.
否则,为什么有人需要更改文件的时间戳?除非造成关于文件年龄的错误印象,否则我看不到任何其他用途,而且这不是合法用途(从我的角度来看)。
cas*_*sey 97
的一个优点touch是它可以指定任意时间戳,而echo -n总是导致当前时间。  
合法使用的一个例子是更新源代码文件的时间戳,这样程序make就会认为源文件比它的编译对象更新并重建它。
其他用途是创建仅基于文件存在而起作用的文件,例如/etc/nologin,如果存在则不允许登录。我还认为这touch myfile是一个比 更简单的构造echo -n >> myfile,并且输入时间更短。
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)
        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 问答,标题为:您可以在不触发“更改”时间戳的情况下对文件做什么?.
LSe*_*rni 20
除了你得到的另外两个非常好的答案之外,用你的话来说,还有一个用途是
制造关于文件年龄的错误印象
例如用于备份方案。您可能不想用较新的备份更新备份,因为它们是相同的,或者因为与更新备份的费用相比,更改无关紧要,例如,到远程主机的慢速线路。要实现这一点,您可以选择使用较新的时间戳标记备份文件,这不是伪造而是声明该文件的有效时间戳现在是不同的。
现在对文件年龄的印象确实是错误的,但其含义是真实的和合法的。
kes*_*lam 20
最常见的用途之一touch是——或者至少曾经是——触发代码的重建。
通常的构建工具——make及其衍生工具——尝试通过不重新编译/重建文件来保存工作,除非创建它们的文件之一发生了变化——例如,如果 .o 文件比 .c 更新源代码,通常可以安全地假设 C 源代码自被编译以生成该目标文件后没有更改。
但有时您想强制重建某些东西。您可以对其源文件之一进行不必要的修改,但这可能会意外损坏某些内容。相反,您可以简单地创建touch文件,使其看起来很新,而不会有任何更改其内容的风险——这足以说服make现在是重建依赖于该文件的所有内容的时候了。
还有其他用途,但从历史上看,这是最大的用途。
mil*_*ose 12
我至少使用过一个 web 框架(不记得是哪个),它在开发模式下查看源代码文件的更改并在发生更改时重新加载应用程序。
当然,有时您希望它在更改它没有看到的内容后重新加载,在这种情况下,touch它的主要配置文件就可以解决问题。
因此,在一般情况下,只要您想启动由文件更改触发的进程,而无需实际更改文件。
sas*_*rsl 11
合法使用触摸:
一种用途是更正未正确设置的文件的时间戳。
例如,大多数复制文件的方式(以及可能移动文件的某些方式)都会导致新文件具有当前时间的时间戳,而不是原始文件的时间戳。
通常,这不是我们想要的。触摸可以“解决”这个问题。
另一个用途是通过将文件时间戳恢复到“编辑...撤消编辑”操作之前的状态来反映已撤消的文件修改。
小智 5
与things喜欢echo(或者> file其他人提到的更好)的一个重要区别是触摸不会粉碎内容。> file将清空文件。touch将不会。不要想着避免内容损坏的技巧,只需使用触摸!无论如何,它会在内核中做更少的工作,因为它只会处理文件的属性,而不会浪费时间实际准备打开然后执行关闭。
即使文件当前处于强制或建议锁定或独占打开状态,触摸也可能会更改时间戳。嗯,从来没有测试过或阅读过它......