はじめに
Linux オペレーティングシステムでは、すべてのファイルには、ファイルが変更された時刻、アクセスされた時刻、または属性が変更された時刻を追跡するタイムスタンプが関連付けられています。これらのタイムスタンプを理解することは、ファイルのアクティビティを監視する必要があるシステム管理者、開発者、および一般ユーザーにとって不可欠です。
このチュートリアルでは、Linux でファイルのタイムスタンプを確認する実用的な手法を紹介します。異なるコマンドを使用して変更時刻とアクセス時刻を表示する方法を学び、Linux 環境での変更をより適切に追跡し、ファイルの使用パターンを監視するのに役立ちます。
Linux でのファイルタイムスタンプの理解
Linux では、各ファイルにはシステムによって自動的に管理される 3 つの重要なタイムスタンプがあります。
ファイルタイムスタンプの種類
- **変更時刻 (Modification Time, mtime)**:ファイルの内容が最後に変更された時刻を記録します。
- **アクセス時刻 (Access Time, atime)**:ファイルが最後に読み取られた、またはアクセスされた時刻を記録します。
- **状態変更時刻 (Change Time, ctime)**:ファイルのメタデータ(パーミッション、所有者)が最後に変更された時刻を記録します。
テストファイルを作成し、そのプロパティを調べることで、ファイルのタイムスタンプの探索を始めましょう。
まず、ターミナルを開き、プロジェクトディレクトリに移動します。
cd ~/project
touch コマンドを使用して、簡単なテキストファイルを作成します。
touch testfile.txt
touch コマンドは、ファイルが存在しない場合は空のファイルを作成し、既に存在する場合はタイムスタンプを更新します。
ls コマンドに -l オプション(長いリスト形式)を付けて、基本的なファイル情報を確認しましょう。
ls -l testfile.txt
次のような出力が表示されるはずです。
-rw-r--r-- 1 labex labex 0 May 15 14:30 testfile.txt
この出力では:
- 最初の列はファイルのパーミッションを示しています。
- 3 列目と 4 列目は所有者とグループを示しています。
- 5 列目はファイルサイズ(0 バイト)を示しています。
- 日付と時刻(この例では "May 15 14:30")は変更時刻を示しています。
- 最後の列はファイル名です。
この基本的なリストには変更時刻が表示されますが、アクセス時刻や状態変更時刻は表示されません。これらについては、次の手順で探索します。
stat コマンドを使用してすべてのタイムスタンプを表示する
ls コマンドは基本的なファイル情報を提供しますが、stat コマンドはファイルに関するより詳細な情報、すべての 3 つのタイムスタンプを含めて提供します。
stat コマンドを使用して、テストファイルのすべてのタイムスタンプを表示しましょう。
stat testfile.txt
次のような出力が表示されるはずです。
File: testfile.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 2101099 Links: 1
Access: (0644/-rw-r--r--) Uid: (1000/labex) Gid: (1000/labex)
Access: 2023-05-15 14:30:00.000000000 +0000
Modify: 2023-05-15 14:30:00.000000000 +0000
Change: 2023-05-15 14:30:00.000000000 +0000
Birth: -
この出力では:
- Access:ファイルが最後にアクセスされた時刻(アクセス時刻、atime)を示します。
- Modify:ファイルの内容が最後に変更された時刻(変更時刻、mtime)を示します。
- Change:ファイルのメタデータが最後に変更された時刻(状態変更時刻、ctime)を示します。
- Birth:ファイルの作成時刻を示します(すべてのファイルシステムでサポートされているわけではありません)。
ファイルを新しく作成したため、現在は 3 つのタイムスタンプがすべて同じであることに注意してください。ファイルを変更して、これらのタイムスタンプがどのように変化するかを見てみましょう。
echo コマンドを使用して、ファイルにいくつかの内容を追加します。
echo "This is a test file" > testfile.txt
今度は、再度タイムスタンプを確認しましょう。
stat testfile.txt
変更時刻(Modify)と状態変更時刻(Change)が更新され、アクセス時刻はシステムの設定によっては同じままであることがわかるはずです。
File: testfile.txt
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 2101099 Links: 1
Access: (0644/-rw-r--r--) Uid: (1000/labex) Gid: (1000/labex)
Access: 2023-05-15 14:30:00.000000000 +0000
Modify: 2023-05-15 14:35:12.000000000 +0000
Change: 2023-05-15 14:35:12.000000000 +0000
Birth: -
変更時刻 (mtime) の確認
変更時刻 (Modification Time, mtime) は、ファイルの内容が変更されるたびに更新されます。このタイムスタンプは、ファイルリストでデフォルトで最も一般的に表示されるものです。
ls を使用して変更時刻を確認する
標準の ls -l コマンドは、デフォルトで変更時刻を表示します。
ls -l testfile.txt
出力:
-rw-r--r-- 1 labex labex 19 May 15 14:35 testfile.txt
今年に変更されたファイルの場合、ls -l は月、日、時刻を表示します。過去の年に変更されたファイルの場合は、時刻の代わりに月、日、年を表示します。
時刻形式のカスタマイズ
より詳細なタイムスタンプ情報を表示するには、ls とともに --time-style オプションを使用します。
ls -l --time-style=full-iso testfile.txt
出力:
-rw-r--r-- 1 labex labex 19 2023-05-15 14:35:12.000000000 +0000 testfile.txt
これは、年、月、日、時、分、秒、およびタイムゾーンを含む完全な ISO 形式のタイムスタンプを表示します。
long-iso や iso などの他の形式オプションも使用できます。
ls -l --time-style=long-iso testfile.txt
出力:
-rw-r--r-- 1 labex labex 19 2023-05-15 14:35 testfile.txt
date を使用して変更時刻を表示する
変更時刻を確認する別の方法は、date コマンドの -r オプションを使用することです。
date -r testfile.txt
出力:
Mon May 15 14:35:12 UTC 2023
このコマンドは、変更時刻を人間が読みやすい形式で表示します。
アクセス時刻 (atime) の確認
アクセス時刻 (Access Time, atime) は、ファイルが読み取られたりアクセスされたりするたびに更新されます。ただし、多くの最新の Linux システムでは、パフォーマンス向上のために relatime や noatime などのマウントオプションを使用して、atime の更新頻度を減らしています。
ls を使用してアクセス時刻を確認する
変更時刻ではなくアクセス時刻を表示するには、ls -l に -u オプションを使用します。
ls -lu testfile.txt
出力:
-rw-r--r-- 1 labex labex 19 May 15 14:40 testfile.txt
表示されるタイムスタンプは、これで変更時刻ではなくアクセス時刻になります。
ファイルにアクセスして、そのアクセス時刻を更新しましょう。
cat testfile.txt
出力:
This is a test file
今度は、再度アクセス時刻を確認しましょう。
ls -lu testfile.txt
アクセス時刻が現在時刻に更新されているはずです。
すべてのタイムスタンプを比較する
ファイルにアクセスした後、stat コマンドを使用してすべてのタイムスタンプを確認しましょう。
stat testfile.txt
出力:
File: testfile.txt
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 2101099 Links: 1
Access: (0644/-rw-r--r--) Uid: (1000/labex) Gid: (1000/labex)
Access: 2023-05-15 14:41:05.000000000 +0000
Modify: 2023-05-15 14:35:12.000000000 +0000
Change: 2023-05-15 14:35:12.000000000 +0000
Birth: -
アクセス時刻のみが変更され、変更時刻と状態変更時刻は以前と同じままであることに注意してください。
ファイルのパーミッションを変更して状態変更時刻を更新する
ファイルのパーミッションを変更して、状態変更時刻 (Change Time, ctime) を更新しましょう。
chmod 640 testfile.txt
再度すべてのタイムスタンプを確認します。
stat testfile.txt
出力:
File: testfile.txt
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 2101099 Links: 1
Access: (0640/-rw-r-----) Uid: (1000/labex) Gid: (1000/labex)
Access: 2023-05-15 14:41:05.000000000 +0000
Modify: 2023-05-15 14:35:12.000000000 +0000
Change: 2023-05-15 14:42:30.000000000 +0000
Birth: -
状態変更時刻 (ctime) が現在時刻に更新され、アクセス時刻と変更時刻は変わらないことがわかります。
touch を使用したファイルのタイムスタンプの操作
touch コマンドを使用すると、ファイルを作成するだけでなく、そのタイムスタンプを更新することもできます。これはテストや、ファイル間のタイムスタンプを同期する必要がある場合に便利です。
すべてのタイムスタンプを更新する
すべてのタイムスタンプ(アクセス時刻、変更時刻、状態変更時刻)を現在時刻に更新するには、次のようにします。
touch testfile.txt
タイムスタンプを確認します。
stat testfile.txt
出力:
File: testfile.txt
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 2101099 Links: 1
Access: (0640/-rw-r-----) Uid: (1000/labex) Gid: (1000/labex)
Access: 2023-05-15 14:45:10.000000000 +0000
Modify: 2023-05-15 14:45:10.000000000 +0000
Change: 2023-05-15 14:45:10.000000000 +0000
Birth: -
アクセス時刻のみを更新する
アクセス時刻のみを更新するには、次のようにします。
touch -a testfile.txt
タイムスタンプを確認します。
stat testfile.txt
出力:
File: testfile.txt
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 2101099 Links: 1
Access: (0640/-rw-r-----) Uid: (1000/labex) Gid: (1000/labex)
Access: 2023-05-15 14:46:15.000000000 +0000
Modify: 2023-05-15 14:45:10.000000000 +0000
Change: 2023-05-15 14:46:15.000000000 +0000
Birth: -
ファイルのメタデータが変更されたため、状態変更時刻 (ctime) も更新されることに注意してください。
変更時刻のみを更新する
変更時刻のみを更新するには、次のようにします。
touch -m testfile.txt
タイムスタンプを確認します。
stat testfile.txt
出力:
File: testfile.txt
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 2101099 Links: 1
Access: (0640/-rw-r-----) Uid: (1000/labex) Gid: (1000/labex)
Access: 2023-05-15 14:46:15.000000000 +0000
Modify: 2023-05-15 14:47:20.000000000 +0000
Change: 2023-05-15 14:47:20.000000000 +0000
Birth: -
再び、状態変更時刻も更新されます。
特定のタイムスタンプを設定する
touch の -d オプションを使用して、特定のタイムスタンプを設定することができます。
touch -d "2023-01-01 12:00:00" testfile.txt
タイムスタンプを確認します。
stat testfile.txt
出力:
File: testfile.txt
Size: 19 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 2101099 Links: 1
Access: (0640/-rw-r-----) Uid: (1000/labex) Gid: (1000/labex)
Access: 2023-01-01 12:00:00.000000000 +0000
Modify: 2023-01-01 12:00:00.000000000 +0000
Change: 2023-05-15 14:48:30.000000000 +0000
Birth: -
これにより、アクセス時刻と変更時刻の両方が 2023 年 1 月 1 日午後 12:00 に設定されます。状態変更時刻は依然として現在時刻に更新されます。
既存のファイルのタイムスタンプを使用して新しいファイルを作成する
-r オプションを使用して、別のファイルのタイムスタンプを参照することもできます。
## Create a new file
touch newfile.txt
## Set its timestamps based on testfile.txt
touch -r testfile.txt newfile.txt
新しいファイルのタイムスタンプを確認します。
stat newfile.txt
出力:
File: newfile.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 2101100 Links: 1
Access: (0644/-rw-r--r--) Uid: (1000/labex) Gid: (1000/labex)
Access: 2023-01-01 12:00:00.000000000 +0000
Modify: 2023-01-01 12:00:00.000000000 +0000
Change: 2023-05-15 14:49:45.000000000 +0000
Birth: -
これで、newfile.txt のアクセス時刻と変更時刻は testfile.txt のものと一致します。
まとめ
この実験では、以下のことを学びました。
- Linux における 3 種類のファイルのタイムスタンプ、つまり変更時刻 (modification time, mtime)、アクセス時刻 (access time, atime)、状態変更時刻 (change time, ctime) を理解する
- 様々なオプションを使用して
lsコマンドでファイルのタイムスタンプを表示する statコマンドを使用して詳細なタイムスタンプ情報を表示する- ファイルの内容を読み取ってアクセス時刻を更新する
- ファイルのパーミッションを変更して状態変更時刻を更新する
touchコマンドを使用してファイルのタイムスタンプを手動で操作する- ファイルに特定のタイムスタンプを適用する
- あるファイルのタイムスタンプを別のファイルにコピーする
これらのスキルは、Linux における効果的なファイル管理と監視に不可欠です。ファイルのタイムスタンプは、変更の追跡、アクセスパターンの監視、およびファイルの適切なメンテナンスを保証するのに役立ちます。不正な変更を追跡するシステム管理者、ファイル関連の問題をデバッグする開発者、またはファイルを整理する一般ユーザーであれ、ファイルのタイムスタンプを理解することは Linux 環境において非常に有用なスキルです。



