在Bash中获取文件创建日期/时间
1. 概述
在本教程中,我们将学习在 Linux 系统上获取文件创建日期的各种方法。
2. 为什么在旧系统上无法获取创建日期?
旧系统运行旧版本的文件系统,不存储文件创建日期。
由于POSIX 标准 仅指定要为文件存储三种类型的时间戳,因此文件系统不需要支持除它们之外的任何内容。这三个时间戳存储以下信息:
- 上次数据访问 – atime
- 最后一次数据修改*——mtime*
- 文件状态变化*——ctime*
但是,较新的文件系统(例如ext4、zfs、btrfs、JFS和 XFS )确实将创建时间戳存储在单独的字段中:
这些字段指向存储在文件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 相似,但它并没有告诉我们文件创建日期。它向我们显示了上次由于更改文件权限等修改而更改文件状态的时间。