linux系统下如何获取文件的创建时间

linux 获取文件的创建时间

提到获取文件的创建时间,写Java的小伙伴可能会说,那太简单了,java.nio.file.attribute.BasicFileAttributes下这个类不就记录了文件的相关信息吗,比如下面这段代码不就得到文件的创建时间了嘛!

@Test
public void getCreateTime () {
    File file = new File("d://aaa.txt");
    BasicFileAttributes attr = null;
    long fileCreateTime = 0L;
    try {
        Path path =  file.toPath();
        attr = Files.readAttributes(path, BasicFileAttributes.class);
        fileCreateTime = attr.creationTime().toMillis();
    } catch (Exception e) {
        logger.info("", e);
    }
    org.joda.time.DateTime dateTime = new DateTime(fileCreateTime);
    String createTimeStr = dateTime.toString("yyy-MM-dd HH:mm:ss");
    System.out.println(createTimeStr);
}
2022-12-20 13:12:15

linux系统下如何获取文件的创建时间_第1张图片

但是查看这个问题的小伙伴可能也已经发现了,该方法在windows系统下可以精准获取到文件的创建时间,但是在linux系统下就获取不到了,拿到的时间不再是文件创建的时间了。

这里先贴出答案,亲测有效。

前置条件:文件存储的文件系统类型必须为 ext4

查看文件系统的类型:df -T

root@firefly:/data# df -T
Filesystem     Type     1K-blocks     Used Available Use% Mounted on
udev           devtmpfs   1962992        0   1962992   0% /dev
tmpfs          tmpfs      1969212    12056   1957156   1% /dev/shm
tmpfs          tmpfs         5120        4      5116   1% /run/lock
tmpfs          tmpfs      1969212        0   1969212   0% /sys/fs/cgroup
/dev/nvme0n1p1 ext4     983456156 20055680 913373932   3% /data

可以到 /data 目录(你要查看的文件所在的文件系统,这里我的文件是在这个下面的)对应的文件系统类型是ext4
/dev/nvme0n1p1 ext4 983456156 20055680 913373932 3% /data

命令行:

debugfs -R "stat <$(ls -i %s | awk '{print $1}')>" %s | grep crtime
  • 第一个参数: 文件的路径
  • 第二个参数:文件所对应的文件系统
root@firefly:/data# debugfs -R "stat <$(ls -i /data/forensics/763a802c-9549-11ed-aee9-a3f2e5f5fe79/mvzbnrg6_20230116105707900_006.ts | awk '{print $1}')>" /dev/nvme0n1p1 | grep crtime
debugfs 1.44.1 (24-Mar-2018)
crtime: 0x63c5143c:28d1b940 -- Mon Jan 16 17:09:16 2023

这里简单说一下这个命令:

首先看下里面的命令 ls -i /data/forensics/ls -i /data/forensics/763a802c-9549-11ed-aee9-a3f2e5f5fe79/mvzbnrg6_20230116105707900_006.ts | awk '{print $1}'

查看当前文件的inode节点:

root@firefly:/data/forensics/763a802c-9549-11ed-aee9-a3f2e5f5fe79# ls -i /data/forensics/763a802c-9549-11ed-aee9-a3f2e5f5fe79/mvzbnrg6_20230116105707900_006.ts  | awk '{print $1}'
55312393

外部的命令,获取该文件的属性信息:

root@firefly:/data/forensics/763a802c-9549-11ed-aee9-a3f2e5f5fe79# debugfs -R "stat <55312393>" /dev/nvme0n1p1 |grep crtime
debugfs 1.44.1 (24-Mar-2018)
crtime: 0x63c5143c:28d1b940 -- Mon Jan 16 17:09:16 2023

可以看到获取到的是标准日期格式,然后我们将标准日期格式转换为我们自己的日期格式就行了。(只获取答案的话,那么到这里就可以结束了)

linux中的文件系统

linux中几种基本的文件系统:ext文件系统、ext2文件系统、ext3文件系统、ext4文件系统、Reiser文件系统、JFS文件系统、XFS文件系统、ZFS文件系统、Btrfs文件系统。

在ext4文件系统中添加了文件的创建时间。

Inode: 55312393   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 607039320    Version: 0x00000000:00000001
User:     0   Group:     0   Project:     0   Size: 26929684
File ACL: 0
Links: 1   Blockcount: 52600
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x63c514f8:8c005aa8 -- Mon Jan 16 17:12:24 2023
 atime: 0x63c5143c:28d1b940 -- Mon Jan 16 17:09:16 2023
 mtime: 0x63c514f8:8c005aa8 -- Mon Jan 16 17:12:24 2023
crtime: 0x63c5143c:28d1b940 -- Mon Jan 16 17:09:16 2023
Size of extra inode fields: 32
Inode checksum: 0xce916ae6
EXTENTS:
(0-6574):11711488-11718062

可以看到一共有

  • ctime: 更改文件的属性会更新其时间,例如修改文件的权限,文件的大小发生变化等。
  • atime: 文件的访问时间,
  • mtime: 文件的修改时间,修改文件内容后该时间会发生改变。
  • crtime: 文件的创建时间,文件创建时的时间,该时间存储在inode节点中。

可能有小伙伴会说,我测试了,crtime是会发生改变的。

root@firefly:/data# touch abc.txt
root@firefly:/data# debugfs -R "stat <$(ls -i /data/abc.txt |awk '{print $1}')>" /dev/nvme0n1p1

Inode: 14   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 607039787    Version: 0x00000000:00000001
User:     0   Group:     0   Project:     0   Size: 0
File ACL: 0
Links: 1   Blockcount: 0
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x63c520e6:2d597c68 -- Mon Jan 16 18:03:18 2023
 atime: 0x63c520e6:2d597c68 -- Mon Jan 16 18:03:18 2023
 mtime: 0x63c520e6:2d597c68 -- Mon Jan 16 18:03:18 2023
crtime: 0x63c520e6:2d1c7368 -- Mon Jan 16 18:03:18 2023
Size of extra inode fields: 32
Inode checksum: 0x15fa8f4c
EXTENTS:

root@firefly:/data# vi abc.txt  # 添加内容后,保存
root@firefly:/data# debugfs -R "stat <$(ls -i /data/abc.txt |awk '{print $1}')>" /dev/nvme0n1p1

Inode: 18   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 607039792    Version: 0x00000000:00000001
User:     0   Group:     0   Project:     0   Size: 8
File ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x63c521e2:904b1548 -- Mon Jan 16 18:07:30 2023
 atime: 0x63c521e2:8f19e848 -- Mon Jan 16 18:07:30 2023
 mtime: 0x63c521e2:8f56f148 -- Mon Jan 16 18:07:30 2023
crtime: 0x63c521e2:8f19e848 -- Mon Jan 16 18:07:30 2023
Size of extra inode fields: 32
Inode checksum: 0x87f54b72
EXTENTS:
(0):38901761


时间都变了,还记得我们说过 crtime是存储在inode节点中的。

当我们使用vi 命令后其实默认会修改我们的inode节点号的。查看当前文件的inode号,vi后再次查看inode号。

root@firefly:/data# ls -i abc.txt
18 abc.txt
root@firefly:/data# vi abc.txt
root@firefly:/data# ls -i abc.txt
17 abc.txt

可以看到使用vi命令后会修改我们文件的唯一标识号 inode。实际上我们进行vi操作的时候,系统默认 backupcopy=no,此时会先将文件重命名为 abc.txt~,然后创建一个新的文件abc.txt,然后向里面写入内容。所以此时的文件已经发生了改变。

我们可以在进行vi的时候设置 backupcopy属性为yes,这时候系统会创建一个abc.txt~的副本,然后在abc.txt里面进行修改,此时文件没有发生改变。所以inode 也不会改变。这时我们可以看到文件crtime还是我们最初创建的时间。

dhfgddsfhjdshgf
~
~
:set backupcopy=yes

你可能感兴趣的:(笔记,linux,java)