Contents

在Bash中获取文件创建日期/时间

1. 概述

在本教程中,我们将学习在 Linux 系统上获取文件创建日期的各种方法。

2. 为什么在旧系统上无法获取创建日期?

旧系统运行旧版本的文件系统,不存储文件创建日期。

由于POSIX 标准 仅指定要为文件存储三种类型的时间戳,因此文件系统不需要支持除它们之外的任何内容。这三个时间戳存储以下信息:

  • 上次数据访问 – atime
  • 最后一次数据修改*——mtime*
  • 文件状态变化*——ctime*

但是,较新的文件系统(例如ext4zfsbtrfsJFS和 XFS )确实将创建时间戳存储在单独的字段中:

  • ext4crtime
  • zfscrtime
  • XFScrtime
  • btrfs -时间
  • JFS - di_otime

这些字段指向存储在文件inode 中的数据。

3. 使用stat获取文件创建日期

获取文件创建日期的最简单方法是使用stat 命令。

让我们创建一个文件并检查它的创建时间:

$ date; echo "Hello" > file
Fri Dec 17 11:26:25 IST 2021
$ cat file
Hello
$ stat file
  File: file
  Size: 6         	Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d	Inode: 1451722     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/blogdemo)   Gid: ( 1000/blogdemo)
Access: 2021-12-17 11:26:25.578441510 +0530
Modify: 2021-12-17 11:26:25.578441510 +0530
Change: 2021-12-17 11:26:25.578441510 +0530
 Birth: 2021-12-17 11:26:25.578441510 +0530

如我们所见,创建日期显示在“出生”字段中。

现在,让我们修改文件并检查是否只有“修改”字段更改,因为它表示最后修改时间:

$ echo "Modified" >> file
$ cat file
Hello
Modified
$ stat file
  File: file
  Size: 15        	Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d	Inode: 1451722     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/blogdemo)   Gid: ( 1000/blogdemo)
Access: 2021-12-17 11:26:25.578441510 +0530
Modify: 2021-12-17 11:28:32.290443553 +0530
Change: 2021-12-17 11:28:32.290443553 +0530
 Birth: 2021-12-17 11:26:25.578441510 +0530

**我们也可以指示stat只给我们所需的数据,在我们的例子中是文件创建日期。*为此,我们可以使用带有%w作为其值的–format*标志:

$ stat -c '%w' file
2021-12-17 11:26:25.578441510 +0530

此外,还有许多其他格式,可以使用stat –help找到:

$ stat --help
...
The valid format sequences for files (without --file-system):
...
  %U   user name of owner
  %w   time of file birth, human-readable; - if unknown
  %W   time of file birth, seconds since Epoch; 0 if unknown
  %x   time of last access, human-readable
...

4. 使用 debugfs获取文件创建日期

我们还可以使用debugfs 命令来查找 ext4 文件系统的创建日期。但是,它不如stat命令直观,因为它的主要目的是调试文件系统。

首先,我们需要文件的 inode 编号。我们可以使用ls命令找到它。

-i标志使ls打印文件的inode 编号:

$ ls -i ./file
5118705 ./file

我们还需要文件的文件系统。我们可以使用df 命令找到它:

~ $ df ./file
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda2             26046564   8380600  16338936  34% /

现在,我们可以将此信息传递给debugfs命令。语法是 debugfs -R ‘stat inode’ /dev/sdX其中inode是我们的文件 inode,/dev/sdX是文件的文件系统:

$ sudo debugfs -R 'stat <5118705>' /dev/sda2
debugfs 1.46.4 (18-Aug-2021)
Inode: 5118705   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 2975709199    Version: 0x00000000:00000001
User:  1000   Group:  1000   Project:     0   Size: 8
File ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x61bc31c8:19fee850 -- Fri Dec 17 06:44:24 2021
atime: 0x61bc3224:7f8fe250 -- Fri Dec 17 06:45:56 2021
mtime: 0x61bc31c8:19fee850 -- Fri Dec 17 06:44:24 2021
crtime: 0x61bc2b65:71f8e150 -- Fri Dec 17 06:17:09 2021
Size of extra inode fields: 32
Inode checksum: 0x5ddd5b4b
EXTENTS:
(0):5279293

这里,创建时间在前面提到的crtime字段中。我们可以看到我们在*“Fri Dec 17 06:17:09 2021”*上创建了文件。

虽然ctime字段听起来与crtime 相似,但它并没有告诉我们文件创建日期。它向我们显示了上次由于更改文件权限等修改而更改文件状态的时间。