Linux如何查找文件的创建时间
Linux的文件能否找到文件的创建时间取决于文件系统类型,在ext4之前的早期文件系统中(ext、ext2、ext3),文件的元数据不会记录文件的创建时间,它只会记录访问时间、修改时间、更改时间(状态更改时间)。
Access 是访问时间,文件数据的最后访问时间。例如读文件内容
Modify 是修改时间,文件数据的最后修改时间。例如使用VIM修改文件内容
Change 是状态更改时间,这个跟Modify时间很容易混淆,change time:更改文件的属性便会更新该时间,比如使用chmod命令更改文件属性,例如chmod、chown命令。或者执行其他命令时隐式的附带更改了文件的属性若文件大小等。
所以,对于ext、ext2、ext3文件格式的文件, 文件创建时间其实是不存在的,若文件从创建后不曾修改过则可认为创建时间=修改时间,若文件创建后状态也不曾改变过文件属性,则可认为创建时间=状态更改时间,若文件创建后不曾被读取过则可认为创建时间=访问时间。但是很少有文件自创建后,从不被访问、修改。所以基本无法找到一个准确的创建时间,但是在ext4文件格式中,文件的创建时间保存在ext4文件系统的inode中,所以我们可以使用debugfs &stat命令来获取准确的文件创建时间。
注意:Linux文件系统繁多,一般较常见的有:ext2、ext3、ext4、jfs、ReiserFS、XFS、Btrfs 。这里面,个人只用过ext3、ext4、XFS文件系统类型。维基百科上列出的文件系统类型有下面这些,很多文件系统都没有使用过,本文测试环境为ext3、ext4、XFS。
文件系统 |
创建命令 |
工具 |
Archiso [1] |
内核文档 [2] |
说明 |
Btrfs |
mkfs.btrfs(8) |
btrfs-progs |
Yes |
btrfs.txt |
稳定状态 |
VFAT |
mkfs.fat(8) |
dosfstools |
Yes |
vfat.txt |
|
exFAT |
mkexfatfs(8) |
exfat-utils |
Yes |
N/A (FUSE-based) |
|
F2FS |
mkfs.f2fs(8) |
f2fs-tools |
Yes |
f2fs.txt |
基于闪存的设备 |
ext3 |
mke2fs(8) |
e2fsprogs |
Yes (base) |
ext3.txt |
|
ext4 |
mke2fs(8) |
e2fsprogs |
Yes (base) |
ext4.txt |
|
HFS |
mkfs.hfsplus(8) |
hfsprogsAUR |
No |
hfs.txt |
macOS 文件系统 |
JFS |
mkfs.jfs(8) |
jfsutils |
Yes (base) |
jfs.txt |
|
NILFS2 |
mkfs.nilfs2(8) |
nilfs-utils |
Yes |
nilfs2.txt |
|
NTFS |
mkfs.ntfs(8) |
ntfs-3g |
Yes |
N/A (FUSE-based) |
Windows 文件系统 |
Reiser4 |
mkfs.reiser4(8) |
reiser4progsAUR |
No |
|
|
ReiserFS |
mkfs.reiserfs(8) |
reiserfsprogs |
Yes (base) |
|
|
UDF |
mkfs.udf(8) |
udftools |
Optional |
udf.txt |
|
XFS |
mkfs.xfs(8) |
xfsprogs |
Yes (base) |
xfs.txt |
|
ZFS |
|
zfs-linuxAUR |
No |
N/A (OpenZFS移植) |
|
步骤一般为:
1:找到文件或目录的索引节点号
ls -i filename
2:找到文件所在的分区或VG
df -T
3:使用debugfs找到文件的创建时间(crtime)
debugfs -R 'stat <xxx>' /dev/xxxx
下面为测试用例,如下所示:
[root@mylnx06 resource]# touch test.txt
[root@mylnx06 resource]# stat test.txt
File: ‘test.txt’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 811h/2065d Inode: 13 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-02-27 09:26:03.833224736 +0800
Modify: 2019-02-27 09:26:03.833224736 +0800
Change: 2019-02-27 09:26:03.833224736 +0800
Birth: -
[root@mylnx06 resource]# ls -i test.txt
13 test.txt
[root@mylnx06 resource]# debugfs -R 'stat <13>' /dev/sdb1
debugfs 1.42.9 (28-Dec-2013)
Inode: 13 Type: regular Mode: 0644 Flags: 0x80000
Generation: 3202520017 Version: 0x00000000:00000001
User: 0 Group: 0 Size: 0
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 0
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x5c75e72b:c6a80080 -- Wed Feb 27 09:26:03 2019
atime: 0x5c75e72b:c6a80080 -- Wed Feb 27 09:26:03 2019
mtime: 0x5c75e72b:c6a80080 -- Wed Feb 27 09:26:03 2019
crtime: 0x5c75e72b:c6a80080 -- Wed Feb 27 09:26:03 2019
Size of extra inode fields: 28
EXTENTS:
[root@mylnx06 resource]# vi test.txt
it is only a test
[root@mylnx06 resource]# debugfs -R 'stat <13>' /dev/sdb1
debugfs 1.42.9 (28-Dec-2013)
Inode: 13 Type: regular Mode: 0644 Flags: 0x80000
Generation: 3202520017 Version: 0x00000000:00000001
User: 0 Group: 0 Size: 0
File ACL: 0 Directory ACL: 0
Links: 0 Blockcount: 0
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x5c75e766:924da674 -- Wed Feb 27 09:27:02 2019
atime: 0x5c75e757:dfe24bb0 -- Wed Feb 27 09:26:47 2019
mtime: 0x5c75e72b:c6a80080 -- Wed Feb 27 09:26:03 2019
crtime: 0x5c75e72b:c6a80080 -- Wed Feb 27 09:26:03 2019
dtime: 0x5c75e766 -- Wed Feb 27 09:27:02 2019
Size of extra inode fields: 28
EXTENTS:
[root@mylnx06 resource]# cat test.txt
it is only a test
[root@mylnx06 resource]# debugfs -R 'stat <13>' /dev/sdb1
debugfs 1.42.9 (28-Dec-2013)
Inode: 13 Type: regular Mode: 0644 Flags: 0x80000
Generation: 3202520017 Version: 0x00000000:00000001
User: 0 Group: 0 Size: 0
File ACL: 0 Directory ACL: 0
Links: 0 Blockcount: 0
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x5c75e766:924da674 -- Wed Feb 27 09:27:02 2019
atime: 0x5c75e757:dfe24bb0 -- Wed Feb 27 09:26:47 2019
mtime: 0x5c75e72b:c6a80080 -- Wed Feb 27 09:26:03 2019
crtime: 0x5c75e72b:c6a80080 -- Wed Feb 27 09:26:03 2019
dtime: 0x5c75e766 -- Wed Feb 27 09:27:02 2019
Size of extra inode fields: 28
EXTENTS:
如果对应的设备为VG,一用也可以使用这个命令。如下所示:
# debugfs -R 'stat <131075>' /dev/mapper/vg_gettestlnx02-datalv
debugfs 1.41.12 (17-May-2010)
Inode: 131075 Type: directory Mode: 0710 Flags: 0x80000
Generation: 2892073157 Version: 0x00000000:0000004c
User: 27 Group: 27 Size: 4096
File ACL: 0 Directory ACL: 0
Links: 2 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x5b778fdf:2276fe98 -- Sat Aug 18 11:17:51 2018
atime: 0x5bc83c23:eb973518 -- Thu Oct 18 15:54:11 2018
mtime: 0x5aab2921:49ff497c -- Fri Mar 16 10:17:05 2018
crtime: 0x5aab3b03:b31acdd0 -- Fri Mar 16 11:33:23 2018
Size of extra inode fields: 28
Extended attributes stored in inode body:
selinux = "unconfined_u:object_r:mysqld_db_t:s0\000" (37)
EXTENTS:
(0): 532514
另外对于xfs类型的文件系统,测试发现,这种方式无效的,如下所示:
# debugfs -R 'stat <73281772>' /dev/sda2
debugfs 1.42.9 (28-Dec-2013)
/dev/sda2: Bad magic number in super-block while opening filesystem
stat: Filesystem not open
因为Linux文件系统种类繁多,本文不可能测试各种文件系统,这个超出了我的技术能力范围。其实,总结这篇文章,只是一个网友在群里咨询了这样问题。后面发现只有ext4文件系统才能找到准确的文件创建时间(当然,不排除还有其它文件类型也可以。)
参考资料:
https://askubuntu.com/questions/470134/how-do-i-find-the-creation-time-of-a-file
https://unix.stackexchange.com/questions/24441/get-file-created-creation-time
http://www.answers.com/Q/Why_doesn%27t_Linux_store_file_creation_time
https://wiki.archlinux.org/index.php/File_systems_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)