我刚刚在以下位置找到了一些有趣的信息man stat
:
a, m, c, B
The time file was last accessed or modified, of when the inode was last changed, or the birth time of the inode.
但是文件的最后修改时间和索引节点的修改时间有什么区别呢?我正在编写一个 bakup-bash 脚本,它允许仅从两个几乎相同的目录复制最后修改的文件,因此我需要知道我更喜欢使用哪个值:)
答案1
Access: 2014-05-20 11:04:27.012146373 -0700
Modify: 2014-04-05 20:59:32.000000000 -0700
Change: 2014-05-20 11:04:22.405479507 -0700
使用权:上次检查文件内容的时间。
调整:上次更改文件内容的时间。
改变:上次更改文件 inode 的时间。
这改变时间包括修改权限和所有权等内容,而调整时间特指文件内容。
或者更准确地说(来自man 2 stat
):
字段 st_atime 通过文件访问而更改,例如通过 execve(2)、mknod(2)、pipe(2)、utime(2) 和 read(2)(超过零字节)。其他例程,如 mmap(2),可能会也可能不会更新 st_atime。
字段 st_mtime 通过文件修改而更改,例如通过 mknod(2)、truncate(2)、utime(2) 和 write(2)(超过零字节)。此外,目录的 st_mtime 会通过在该目录中创建或删除文件来更改。 st_mtime 字段不会因所有者、组、硬链接计数或模式的更改而更改。
通过写入或设置inode信息(即所有者、组、链接计数、模式等)来更改字段st_ctime。
有趣的是,直接操作文件时间算作对 inode 的修改,这会将 ctime 更改为当前时钟时间。所以你可以将ctime设置为当前的时间,但您不能将其设置为任何其他时间,就像其他两个时间一样。这使得时间一个有用的金丝雀来发现文件何时时间可能已被移回。
另外,虽然您可以更改索引节点而不更改文件内容(即时间可以改变没有时间改变),反之则不然。每次修改文件内容时,您也必然会碰触到时间。