在我的 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 未修改。