在Linux里,相当长一段时间里,用户层面并没有文件创建时间的概念,无论是用ls还是stat指令怎么查看linux系统版本号,都未能获取到文件的创建时间,不信就试一试:
[tudou@tudou-pc statx]$ stat test-statx.c 文件:test-statx.c 大小:6656 块:16 IO 块:4096 普通文件 设备:805h/2053d Inode:6684737 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 1000/ tudou) Gid:( 1001/ tudou) 最近访问:2018-10-07 13:16:29.000000000 +0800 最近更改:2018-10-07 13:21:09.855461986 +0800 最近改动:2018-10-07 13:21:09.855461986 +0800 创建时间:-
很大概率可以见到「创建时间」一行总是「-」。
注:笔者使用的操作系统为archlinux,Kernel版本号4.10.4
假如我们使用百度的话,会看见好多文章说,近来改动时间就是创建时间。的确linux操作系统版本,我们拿好多文件试验了下,这个近来改动时间(ChangeTime)确实和创建时间很相仿,但是Changetime并不是Createtime,它实际是文件属性更改时间。试一下即知:
[tudou@tudou-pc 下载]$ stat ~/.face statx(/home/tudou/.face) = 0 results=fff Size: 7589 Blocks: 16 IO Block: 4096 regular file Device: 08:05 Inode: 5505043 Links: 1 Access: (0644/-rw-r--r--) Uid: 1000 Gid: 1001 Access: 2018-09-16 01:15:52.320014139+0800 Modify: 2018-09-16 01:15:52.320014139+0800 Change: 2018-09-16 01:15:52.320014139+0800 Attributes: 0000000000000000 (........ ........ ........ ........ ........ ........ ....-... .---.-..) [tudou@tudou-pc 下载]$ chattr +u ~/.face [tudou@tudou-pc 下载]$ stat ~/.face statx(/home/tudou/.face) = 0 results=fff Size: 7589 Blocks: 16 IO Block: 4096 regular file Device: 08:05 Inode: 5505043 Links: 1 Access: (0644/-rw-r--r--) Uid: 1000 Gid: 1001 Access: 2018-09-16 01:15:52.320014139+0800 Modify: 2018-09-16 01:15:52.320014139+0800 Change: 2018-10-07 16:17:10.929769171+0800 Attributes: 0000000000000000 (........ ........ ........ ........ ........ ........ ....-... .---.-..)
可以很清楚地看出,Changetime际是文件属性更改时间,Linux还真难以获取文件创建时间。
不过,linux也不是完全不支持文件创建时间,文件系统如ext4似乎是支持的,只是没有API可以获取到这个数据。例如Java提供的文件API怎么查看linux系统版本号,也就因而未能获取文件创建时间。
不过,自内核4.11版本引入的statx系统调用支持获取创建时间了,数组名里用的是btime(Birthtime)。
假如用户想要实现在代码里获取这个创建时间,这么只须要调用glibc提供的API即可。并且目前glibc还没有支持linux 删除文件,所以只能自己用syscall函数调用。假如仅仅只是想自己实现一个小工具来获取这个时间,这么内核源码树里samples/statx/test-statx.c这个文件就是现成的实现。下载源码:,选择一个和自己操作系统版本近来的源码分支.你要是不想下载几十M的linux源码的话,也可以从这儿()获取到各个linux版本的源码
我们来编译文件:
[tudou@tudou-pc statx]$ gcc -O2 -o statx test-statx.c In file included from /usr/include/sys/stat.h:446, from test-statx.c:28: /usr/include/bits/statx.h:25:8: 错误:‘struct statx_timestamp’重定义 struct statx_timestamp ^~~~~~~~~~~~~~~ In file included from test-statx.c:26: /usr/include/linux/stat.h:56:8: 附注:原先在这里定义 struct statx_timestamp { ^~~~~~~~~~~~~~~ In file included from /usr/include/sys/stat.h:446, from test-statx.c:28: /usr/include/bits/statx.h:36:8: 错误:‘struct statx’重定义
注释如下两行代码:
#define _GNU_SOURCE #define _ATFILE_SOURCE
再度编译即可。
[tudou@tudou-pc statx]$ gcc -O2 -o statx test-statx.c [tudou@tudou-pc statx]$ ./statx test-statx.c statx(test-statx.c) = 0 results=fff Size: 6656 Blocks: 16 IO Block: 4096 regular file Device: 08:05 Inode: 6684737 Links: 1 Access: (0644/-rw-r--r--) Uid: 1000 Gid: 1001 Access: 2018-10-07 13:16:29.000000000+0800 Modify: 2018-10-07 13:21:09.855461986+0800 Change: 2018-10-07 13:21:09.855461986+0800 Birth: 2018-10-07 13:16:47.771175840+0800 Attributes: 0000000000000000 (........ ........ ........ ........ ........ ........ ....-... .---.-..)
另外一个思路,使用debugfs来搞。
注:4.19及以上内核早已支持文件创建时间了。但大部份用户的Linux服务器内核都比较老,尚不支持这个特点