`cat` 影响最后一个 `Access` 时间,但不影响最后一个 `Change` 时间

`cat` 影响最后一个 `Access` 时间,但不影响最后一个 `Change` 时间

在我的 Ubuntu 系统上,我prueba.txt使用touch prueba.txt.当我使用 显示其文件统计信息时stat prueba.txt,输出如下:

  File: prueba.txt
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fc01h/64513d    Inode: 4092        Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-10-07 13:04:57.621272608 +0000
Modify: 2022-10-07 13:04:57.621272608 +0000
Change: 2022-10-07 13:04:57.621272608 +0000
 Birth: 2022-10-07 13:04:57.621272608 +0000

然后,当我使用打印文件内容cat prueba.txt然后stat prueba.txt再次运行时,输出如下:

  File: prueba.txt
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fc01h/64513d    Inode: 4092        Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-10-07 13:06:18.852005488 +0000
Modify: 2022-10-07 13:04:57.621272608 +0000
Change: 2022-10-07 13:04:57.621272608 +0000
 Birth: 2022-10-07 13:04:57.621272608 +0000

注意,Access时间变了,但Change时间没有变。但是,在man 7 inode描述(除其他外)此文件元数据的条目中,提供了有关 含义的以下信息Change

Last status change timestamp (ctime)
              stat.st_ctime; statx.stx_ctime

              This is the file's last status change timestamp.  It is changed by writing or by setting inode informa‐
              tion (i.e., owner, group, link count, mode, etc.).

如果我理解正确的话,Change每当有任何文件数据时,时间都应该更新或元数据被修改,包括(我假设)Access元数据。那么,为什么cat文件会影响其元数据的值,但在此过程中Access不会改变其元数据呢?Change我是否误解了该条目的含义man,或者误解了如何cat以某种方式运作?

答案1

Linux 为每个文件保留三个时间戳:

  • 时间:最后一次修改文件内容(数据本身)的时间。可以通过查看ls -l
  • 时间:上次更改文件内容或文件元数据(所有者、组、权限、链接计数等)的时间。这不包括时间戳。可以通过查看ls -lc
  • 阿泰姆:上次访问文件以读取其内容的时间。可以通过查看ls -lu

正如预期的那样,通过更改其 atime 读取文件cat。在此操作期间,文件内容及其元数据均未更改,因此其 ctime 未修改。

相关内容