查看 Linux 系统中文件的创建时间

陪她去流浪 桃子 2020年11月09日 阅读次数:1089

Linux 的操作系统的文件概念中的时间其实只有三种^

  • 访问时间,Access Time,atime

    文件内容的最后访问时间,即最后一次读取的时间。

  • 修改时间,Modification Time,mtime

    文件内容的最后修改时间,即最后一次写入的时间。

  • 改变时间,Change Time,ctime

    文件元数据的最后改变时间。元数据包含权限位等。

你没有看错,创建时间(crtime)不在上述列表中。这是另很多人匪夷所思的,居然没有创建时间!

但是,你如果 stat 一个文件的话,它其实会显示一个空白的创建时间。最后一行,显示为 Birth:

$ stat --version
stat (GNU coreutils) 8.30
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.

$ stat playbox.sh
  File: playbox.sh
  Size: 96              Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 655367      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/      pi)   Gid: ( 1000/      pi)
Access: 2020-10-08 17:11:52.077414970 +0800
Modify: 2020-04-23 01:19:45.995704571 +0800
Change: 2020-04-23 01:19:45.995704571 +0800
 Birth: -

所以,stat 其实早就为创建时间预留了一行是吗?是的。那谁提供了创建时间呢?它是:ext4^。 但是,由于难以改动 stat 这个系统调用。所以大家都在等待一个新的系统调用:statx^

而从 stat 版本 8.31 开始,就已经开始显示创建时间了:

$ stat --version
stat (GNU coreutils) 8.32.67-ff80b
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.

$ stat playbox.sh
  File: playbox.sh
  Size: 96              Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d      Inode: 655367      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/      pi)   Gid: ( 1000/      pi)
Access: 2020-10-08 17:11:52.077414970 +0800
Modify: 2020-04-23 01:19:45.995704571 +0800
Change: 2020-04-23 01:19:45.995704571 +0800
 Birth: 2020-04-23 01:19:45.995704571 +0800

我的树莓派上的 stat 是 8.30,后面的新版本是我自己编译的 coreutils 8.32 版本。

8.30 发布于 2018-07-01,8.31 发布于 2019-03-10。(来自:git show v8.31

更新 coreutils 成本有点高,还有没有其它的办法?有,但是偏麻烦:用 debugfs !

  • 先拿到 inode 号

    $ ls -i playbox.sh
    655367 playbox.sh
    
  • 然后用 debugfs 显示

    $ 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 输出的时间并不一致。我还没找到原因,等确定后再来更新文章。

参考

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:linux · 文件系统