如果我是对的:
atime
是最后一次读取/访问文件的时间。mtime
是文件内容最后一次修改的时间。ctime
是文件的索引节点最后一次更改的时间。
问题:
如果文件的内容存储在其 inode 之外,则更改其内容会将 mtime 更改为当前,但这会将其 ctime 和 atime 更改为当前吗?
如果我们更改存储在其 inode 中的文件属性,则会将 ctime 更改为当前,但这会更改 mtime 和 atime 为当前吗?
更改与文件相关的任何内容(例如其内容、属性或索引节点)是否也会更改时间?
答案1
正如@Celada 所说,这真的很容易测试。
但需要注意的是:ctime
是最后一次更改 inode 信息(inode 编号未更改)。
所以:
- 如果文件的内容存储在其 inode 之外,则更改其内容会将 mtime 更改为当前,但这会将其 ctime 和 atime 更改为当前吗?
如果您更改内容,mtime
不仅会更改,而且还会更改,ctime
因为文件的时间戳(可能还有其大小)会更新,并且这些信息存储在 inode 中。
另外,假设这是一个文本文件,并且您使用 修改其内容vi
,因此atime
也会更新,因为显然vi
会在显示文件之前读取该文件。
例子:
$ touch file1
$ stat file1
Access: 2015-05-06 19:11:41.887622158 +0200
Modify: 2015-05-06 19:11:41.887622158 +0200
Change: 2015-05-06 19:11:41.887622158 +0200
$ echo "hello" >> file1
$ stat file1
Access: 2015-05-06 19:11:41.887622158 +0200
Modify: 2015-05-06 19:12:27.816047883 +0200
Change: 2015-05-06 19:12:27.816047883 +0200
- 如果我们更改存储在其 inode 中的文件属性,则会将 ctime 更改为当前,但这会更改 mtime 和 atime 为当前吗?
如果仅更改文件的属性,则仅存储在 inode 中的信息会更改,所以是的,只会ctime
更改。
$ stat file2
Access: 2015-05-06 19:28:09.378880724 +0200
Modify: 2015-05-06 19:28:09.378880724 +0200
Change: 2015-05-06 19:28:09.378880724 +0200
$ chmod 700 file2
$ stat file2
Access: 2015-05-06 19:28:09.378880724 +0200
Modify: 2015-05-06 19:28:09.378880724 +0200
Change: 2015-05-06 19:30:24.679022346 +0200
- 更改与文件相关的任何内容(例如其内容、属性或索引节点)是否也会更改时间?
正如我在第一个问题中所说,如果您不需要读取文件来更改这些信息,则atime
不会更改。
答案2
你还需要两句话:
atime
仅当您阅读、打开或触摸文件时才会更改。ctime
当文件内容改变时也会改变。
考虑到这些,我们可以轻松回答您的问题:
- 如果文件的内容存储在其 inode 之外,则更改其内容会将 mtime 更改为当前,但这会将其 ctime 和 atime 更改为当前吗?
它将改变ctime
,而不是atime
。
- 如果我们更改存储在其 inode 中的文件属性,则会将 ctime 更改为当前,但这会更改 mtime 和 atime 为当前吗?
不,它不会改变mtime
并且atime
- 更改与文件相关的任何内容(例如其内容、属性或索引节点)是否也会更改时间?不,
atime
仅当您阅读、打开或触摸文件时才会更改。
要记住的事情:
atime
只有当你改变时读,打开, 或者触碰文件。ctime
mtime
将更新为与ifmtime
已更新相同。- 改变
ctime
可能会改变,也可能不会改变mtime
,也可能不会改变atime
。