Bashでファイル作成日時を取得
1. 概要
このチュートリアルでは、Linuxシステムでファイルの作成日を取得するためのさまざまな方法を学習します。
2. 古いシステムで作成日を取得できないのはなぜですか?
古いシステムは、ファイル作成日を保存しない古いバージョンのファイルシステムを実行します。
POSIX標準はファイルに保存されるタイムスタンプの3種類のみを指定しているため、ファイルシステムがそれらを超えるものをサポートする必要はありません。 これらの3つのタイムスタンプには、以下に関する情報が格納されます。
- 最後のデータアクセス– atime
- 最終データ変更– mtime
- ファイルステータスの変更– ctime
ただし、 ext4 、 zfs、 btrfs 、 JFS、、XFSなどの新しいファイルシステムは作成を保存します別のフィールドのタイムスタンプ:
これらのフィールドは、ファイルiノードに保存されているデータを指します。
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/baeldung) Gid: ( 1000/baeldung)
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/baeldung) Gid: ( 1000/baeldung)
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 -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コマンドほど直感的ではありません。
まず、ファイルのiノード番号が必要です。 lsコマンドで見つけることができます。
-i フラグにより、lsはファイルのiノード番号を出力します。
$ 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です。
$ 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フィールドにあります。 「FriDec1706:17:092021」にファイルを作成したことがわかります。
ctimeフィールドはcrtimeに似ていますが、はファイルの作成日を示していません。 ファイルのアクセス許可の変更などの変更によってファイルのステータスが最後に変更された時刻が表示されます。
5. 結論
この記事では、ファイル作成日が利用できない歴史的な理由と、最新のシステムで作成日を取得する方法について説明しました。