Linux 的操作系统的文件概念中的时间其实只有三种^:
-
访问时间,Access Time,atime
文件内容的最后访问时间,即最后一次读取的时间。
-
修改时间,Modification Time,mtime
文件内容的最后修改时间,即最后一次写入的时间。
-
改变时间,Change Time,ctime
文件元数据的最后改变时间。元数据包含权限位等。
你没有看错,创建时间(crtime)不在上述列表中。这是另很多人匪夷所思的,居然没有创建时间!
但是,你如果 stat 一个文件的话,它其实会显示一个空白的创建时间。最后一行,显示为 Birth:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
所以,stat 其实早就为创建时间预留了一行是吗?是的。那谁提供了创建时间呢?它是:ext4^。
但是,由于难以改动 stat 这个系统调用。所以大家都在等待一个新的系统调用:statx
^。
而从 stat 版本 8.31 开始,就已经开始显示创建时间了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
我的树莓派上的 stat 是 8.30,后面的新版本是我自己编译的 coreutils 8.32 版本。
8.30 发布于 2018-07-01,8.31 发布于 2019-03-10。(来自:git show v8.31
)
更新 coreutils 成本有点高,还有没有其它的办法?有,但是偏麻烦:用 debugfs !
-
先拿到 inode 号
1 2
$ ls -i playbox.sh 655367 playbox.sh
-
然后用
debugfs
显示1 2 3 4 5 6 7 8 9 10 11 12 13 14
$ sudo debugfs -R 'stat <655367>' /dev/mmcblk0p2 Inode: 655367 Type: regular Mode: 0644 Flags: 0x80000 Generation: 1622064498 Version: 0x00000000:00000001 User: 0 Group: 0 Project: 0 Size: 0 File ACL: 0 Links: 0 Blockcount: 0 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x5e5d718c:d3af3efc -- Tue Mar 3 04:50:20 2020 atime: 0x5df81753:00000000 -- Tue Dec 17 07:46:27 2019 mtime: 0x5e5d718c:d3af3efc -- Tue Mar 3 04:50:20 2020 crtime: 0x5e5d698c:6958e6c8 -- Tue Mar 3 04:16:12 2020 dtime: 0x5e5d718c:(d3af3efc) -- Tue Mar 3 04:50:20 2020 Size of extra inode fields: 32 EXTENTS:
后面的 /dev/mmcblk0p2 是文件所在的文件系统。
不过,上述命令有一个问题,debugfs 和 stat 输出的时间并不一致。我还没找到原因,等确定后再来更新文章。