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に指示することもできます。 このために、私たちは使用することができます -フォーマットフラグ %w その値として:

$ 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です。 ‘/ 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フィールドにあります。 「FriDec1706:17:092021」にファイルを作成したことがわかります。

ctimeフィールドはcrtimeに似ていますが、はファイルの作成日を示していません。 ファイルのアクセス許可の変更などの変更によってファイルのステータスが最後に変更された時刻が表示されます。

5. 結論

この記事では、ファイル作成日が利用できない歴史的な理由と、最新のシステムで作成日を取得する方法について説明しました。