我刚刚在以下位置找到了一些有趣的信息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.
Run Code Online (Sandbox Code Playgroud)
但是文件上次修改时间和 inode 的修改时间有什么区别呢?我正在编写一个 bakup-bash 脚本,它只允许从两个几乎相同的目录中复制最后修改过的文件,所以我需要知道我更喜欢使用哪个值:)
tyl*_*erl 12
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
Run Code Online (Sandbox Code Playgroud)
访问:上次检查文件内容的时间。
修改:上次更改文件内容的时间。
更改:上次更改文件的 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 字段不会因所有者、组、硬链接计数或模式的变化而改变。
字段 st_ctime 通过写入或设置 inode 信息(即所有者、组、链接计数、模式等)来更改。
有趣的是,对文件时间的直接操作算作对 inode 的修改,这会将 ctime 推到当前时钟时间。因此您可以将 ctime 设置为当前时间,但不能将其设置为任何其他时间,就像其他两个时间一样。这使得ctime成为一个有用的金丝雀,可以发现文件的mtime何时可能已被移回。
此外,虽然您可以在不更改文件内容的情况下更改 inode(即,ctime可以更改而mtime 不更改),但反之则不然。每次修改文件的内容时,您最终都会遇到ctime。