はじめに
Linux オペレーティングシステムでは、ファイルとディレクトリは、その内容だけでなく、重要なメタデータも保持しています。このメタデータには、ファイルパーミッション、所有者、サイズ、さまざまなタイムスタンプなどの情報が含まれます。Linux の stat コマンドは、ファイルとディレクトリに関するこの詳細な情報を取得し、表示するための強力な方法を提供します。
この実験(Lab)では、stat コマンドを使用してファイルメタデータを調べ、さまざまなタイムスタンプの種類を理解し、特定の情報を抽出するために出力形式をカスタマイズする方法を学びます。これらのスキルは、システム管理、ファイルパーミッションの問題のトラブルシューティング、およびファイル変更の監視に不可欠です。
stat コマンドの基本的使用法
Linux の stat コマンドは、ファイルとディレクトリに関する包括的な情報を提供します。このステップでは、stat コマンドの基本的な形式を使用し、その出力を理解する方法を学びます。
stat コマンドの理解
stat コマンドは、ls のような通常のコマンドでは通常表示されないメタデータ情報を明らかにします。このメタデータには以下が含まれます。
- ファイルサイズとブロック割り当て
- Inode 情報
- アクセス許可
- ユーザーとグループの所有権
- さまざまなタイムスタンプ
- ファイルタイプ
テストファイルの作成
この実験(Lab)全体で使用できる簡単なテキストファイルを作成することから始めましょう。
echo "This is a test file for the stat command." > ~/project/testfile.txt
上記のコマンドをターミナルで実行します。これにより、project ディレクトリに、1 行のテキストを含む testfile.txt という名前のファイルが作成されます。
基本的な stat コマンドの使用
次に、stat コマンドを使用して、作成したファイルのメタデータを調べましょう。
stat ~/project/testfile.txt
次のような出力が表示されるはずです。
File: /home/labex/project/testfile.txt
Size: 41 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 12345678 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ labex) Gid: ( 1000/ labex)
Access: 2023-04-28 10:30:00.000000000 +0000
Modify: 2023-04-28 10:30:00.000000000 +0000
Change: 2023-04-28 10:30:00.000000000 +0000
Birth: -
出力の理解
この出力の主要な要素を分解してみましょう。
- File: ファイルへのフルパス
- Size: ファイルのサイズ(バイト単位)
- Blocks: 割り当てられたブロック数
- IO Block: ファイルシステム I/O のブロックサイズ
- Device: デバイス ID(16 進数/10 進数)
- Inode: Inode 番号(ファイルの固有の識別子)
- Links: ハードリンクの数
- Access: 数値(8 進数)形式と記号形式の両方のファイルパーミッション
- Uid/Gid: ファイル所有者のユーザー ID とグループ ID
- Access/Modify/Change/Birth: ファイルに関連するさまざまなタイムスタンプ
タイムスタンプは特に重要です。
- Access: ファイルが最後に読み取られたとき
- Modify: ファイルの内容が最後に変更されたとき
- Change: ファイルのメタデータが最後に変更されたとき
- Birth: 作成時間(すべてのファイルシステムで利用できるわけではありません)
これで、stat コマンドを使用して基本的なファイルメタデータを表示し、解釈する方法を学びました。
ファイルのタイムスタンプとパーミッションの探索
このステップでは、ファイルのタイムスタンプをさらに詳しく調べ、ファイルパーミッションを変更する方法を学びます。ファイルメタデータのこれらの側面を理解することは、ファイル管理とセキュリティにとって重要です。
ファイルのタイムスタンプの理解
前のステップで見たように、Linux は各ファイルに対していくつかのタイムスタンプを保持しています。
- アクセス時間 (atime): ファイルが読み取られたときに更新されます
- 変更時間 (mtime): ファイルの内容が変更されたときに更新されます
- 変更時間 (ctime): ファイルのメタデータ(パーミッション、所有権)が変更されたときに更新されます
- 作成時間 (btime): ファイルが作成された時間を記録します(すべてのファイルシステムで利用できるわけではありません)
これらのタイムスタンプがどのように変化するかを説明しましょう。
- まず、テストファイルの現在のタイムスタンプを確認します。
stat ~/project/testfile.txt
- 次に、ファイルの内容を変更します。
echo "Adding a new line to change the modification time." >> ~/project/testfile.txt
- もう一度タイムスタンプを確認します。
stat ~/project/testfile.txt
ファイルの内容を変更したため、変更時間 (Modify) と変更時間 (Change) の両方が更新されていることに気付くはずです。
ファイルパーミッションの操作
ファイルパーミッションは、誰がファイルを読み取り、書き込み、または実行できるかを決定します。stat コマンドは、記号形式 (-rw-r--r--) と数値形式 (0644) の両方でパーミッションを表示します。
パーミッションを表示および変更する方法を調べてみましょう。
- まず、テストファイルの現在のパーミッションを確認します。
stat -c '%A %a %n' ~/project/testfile.txt
このコマンドは、カスタム形式を表示するために -c オプションを使用します。
%Aは、記号形式でパーミッションを表示します%aは、8 進数(数値)形式でパーミッションを表示します%nは、ファイル名を表示します
出力は次のようになります。
-rw-r--r-- 644 /home/labex/project/testfile.txt
- 次に、パーミッションを変更します。
chmod 755 ~/project/testfile.txt
このコマンドは、パーミッションを 755 に変更します。これは、次のことを意味します。
- 所有者は、読み取り、書き込み、および実行のパーミッションを持っています (7 = 4+2+1)
- グループは、読み取りと実行のパーミッションを持っています (5 = 4+1)
- その他は、読み取りと実行のパーミッションを持っています (5 = 4+1)
- もう一度パーミッションを確認します。
stat -c '%A %a %n' ~/project/testfile.txt
出力は次のようになります。
-rwxr-xr-x 755 /home/labex/project/testfile.txt
- 変更時間がどのように影響を受けたかも確認しましょう。
stat ~/project/testfile.txt | grep Change
Change タイムスタンプが更新されたことに気付くはずです。これは、ファイルのメタデータ(パーミッション)を変更したためです。
タイムスタンプとパーミッションを理解することは、システム管理とファイルアクセスに関する問題のトラブルシューティングに不可欠です。stat コマンドを使用すると、ファイルメタデータのこれらの側面を簡単に監視できます。
stat コマンドでのカスタムフォーマットの使用
stat コマンドの最も強力な機能の 1 つは、その出力形式をカスタマイズできることです。これは、ファイルに関する特定の情報が必要な場合や、スクリプトで出力を利用したい場合に特に役立ちます。
フォーマットオプション
stat コマンドは、出力形式をカスタマイズするための -c または --format オプションを提供します。このオプションを使用すると、表示する情報と、そのフォーマット方法を決定するフォーマット文字列を指定できます。
作業用の別のテストファイルを作成しましょう。
echo "This is another test file." > ~/project/second_file.txt
フォーマット指定子
stat コマンドは、% で始まるさまざまなフォーマット指定子をサポートしています。以下は、最も一般的に使用されるもののいくつかです。
%n: ファイル名%s: ファイルサイズ(バイト単位)%b: 割り当てられたブロック数%u: 所有者のユーザー ID%U: 所有者のユーザー名%g: 所有者のグループ ID%G: 所有者のグループ名%a: アクセス権(8 進数形式)%A: アクセス権(人間が読める形式)%x: 最終アクセス時間%y: 最終変更時間%z: 最終変更時間
いくつかの例を試してみましょう。
- ファイル名とサイズを表示します。
stat -c '%n is %s bytes' ~/project/testfile.txt
出力は次のようになります。
/home/labex/project/testfile.txt is 85 bytes
- 所有者とパーミッションを表示します。
stat -c 'Owner: %U, Permissions: %A' ~/project/testfile.txt
出力は次のようになります。
Owner: labex, Permissions: -rwxr-xr-x
- 複数の情報を表示します。
stat -c 'File: %n\nSize: %s bytes\nOwner: %U\nPermissions: %A\nModified: %y' ~/project/testfile.txt
このコマンドは、ファイル名、サイズ、所有者、パーミッション、および変更時間をそれぞれ新しい行に表示します。
- 複数のファイルに関する情報を比較します。
stat -c '%n: %s bytes, modified %y' ~/project/testfile.txt ~/project/second_file.txt
このコマンドは、両方のファイルのファイル名、サイズ、および変更時間を表示します。
スクリプトでの Stat の使用
カスタムフォーマット機能は、特定の情報を抽出する必要がある場合に、シェルスクリプトで特に役立ちます。複数のファイルの合計サイズを計算する簡単なスクリプトを作成しましょう。
echo '#!/bin/bash
total=0
for file in "$@"; do
size=$(stat -c "%s" "$file")
echo "File: $file, Size: $size bytes"
total=$((total + size))
done
echo "Total size: $total bytes"' > ~/project/file_size.sh
chmod +x ~/project/file_size.sh
次に、テストファイルでスクリプトを実行しましょう。
~/project/file_size.sh ~/project/testfile.txt ~/project/second_file.txt
出力には、各ファイルのサイズと合計サイズが表示されます。
stat コマンドのカスタムフォーマットオプションを習得することで、特定のニーズに合わせてファイルメタデータを効率的に抽出して処理できます。
ディレクトリとファイルシステムの操作
このステップでは、stat コマンドをディレクトリとファイルシステムで使用する方法を説明します。この知識は、システム管理タスクやストレージ使用量の理解に役立ちます。
ディレクトリでの Stat コマンド
stat コマンドは、ファイルと同様にディレクトリでも機能します。テストディレクトリを作成し、そのメタデータを調べてみましょう。
mkdir -p ~/project/test_dir
stat ~/project/test_dir
ファイルの場合と同様の出力が表示されますが、ファイルの種類フィールドには「regular file」の代わりに「directory」と表示されます。
ファイルとディレクトリの主な違いは、ディレクトリには通常、より多くのリンクがあることです(直接の各サブディレクトリに対して 1 つ、ディレクトリ自体とその親に対して 2 つ)。
サブディレクトリを作成し、それがリンク数にどのように影響するかを見てみましょう。
mkdir -p ~/project/test_dir/sub_dir
stat ~/project/test_dir
リンク数が 1 増加したことに気付くはずです。
ファイルシステム情報
stat コマンドは、-f または --file-system オプションを使用して、ファイルシステムに関する情報も提供できます。このオプションは、ファイルシステムの種類、ブロックサイズ、および使用状況統計などの詳細を表示します。
プロジェクトディレクトリを含むファイルシステムを調べてみましょう。
stat -f ~/project
出力には以下が含まれます。
- ファイルシステムの種類
- ブロックサイズ
- 合計ブロック数
- 空きブロック数
- 利用可能なブロック数(root 以外のユーザー向け)
- 合計 inode 数
- 空き inode 数
この情報は、ディスク容量の使用状況を監視し、容量を計画するのに役立ちます。
オプションの組み合わせ
ファイルシステムオプションとカスタムフォーマットオプションを組み合わせて、特定の情報を抽出できます。
stat -f -c 'File System: %T\nTotal size: %b blocks\nFree: %f blocks\nAvailable: %a blocks' ~/project
このコマンドは、ファイルシステムの種類、合計ブロック数、空きブロック数、および利用可能なブロック数を表示します。
シンボリックリンクの追跡
デフォルトでは、stat コマンドがシンボリックリンクに遭遇すると、リンク自体に関する情報が表示され、それが指すファイルに関する情報は表示されません。シンボリックリンクを作成し、実際に見てみましょう。
echo "Target file content" > ~/project/target_file.txt
ln -s ~/project/target_file.txt ~/project/symlink.txt
stat ~/project/symlink.txt
出力には、ファイルの種類が「symbolic link」であり、サイズがターゲットファイルへのパスの長さであることが表示されます。
リンクではなくターゲットファイルに関する情報を表示するには、-L または --dereference オプションを使用します。
stat -L ~/project/symlink.txt
これで、出力にはターゲットファイルに関する情報が表示され、サイズと種類が「regular file」として表示されます。
実用的なアプリケーション:大きなディレクトリの検索
stat コマンドの実用的なアプリケーションの 1 つは、大きなディレクトリを見つけることです。ディレクトリサイズを計算するスクリプトを作成しましょう。
echo '#!/bin/bash
for dir in "$@"; do
if [ -d "$dir" ]; then
size=$(du -s "$dir" | cut -f1)
echo "Directory: $dir, Size: $size KB"
else
echo "$dir is not a directory"
fi
done' > ~/project/dir_size.sh
chmod +x ~/project/dir_size.sh
次に、テストディレクトリでスクリプトを実行しましょう。
~/project/dir_size.sh ~/project/test_dir
このスクリプトは、du コマンドを使用してディレクトリサイズを計算し、stat コマンドによって提供されるメタデータ情報を補完します。
stat コマンドをディレクトリとファイルシステムで使用する方法を理解することで、Linux システムのストレージの構成と使用状況に関する貴重な洞察を得ることができます。
まとめ
この実験では、Linux の stat コマンドを使用してファイルメタデータを取得し、分析する方法を学習しました。以下の内容を学習しました。
- 包括的なファイル情報を表示するための
statコマンドの基本的な使用法 - ファイルのタイムスタンプとパーミッションを理解し、操作する方法
- 特定のメタデータ情報を抽出するためのカスタムフォーマットの使用
- ディレクトリとファイルシステムを操作して、ストレージの使用状況に関する洞察を得る
これらのスキルは、システム管理、ファイルアクセス問題のトラブルシューティング、ファイル変更の監視、およびストレージ構成の理解に役立ちます。 stat コマンドは、Linux がすべてのファイルとディレクトリに対して保持する詳細なメタデータへの窓を提供し、ファイルシステムに関するより深い洞察を得ることができます。
stat コマンドとそのさまざまなオプションを習得することにより、ファイルをより効果的に管理し、問題をより効率的に診断するのに役立つ強力なツールを Linux ツールキットに追加しました。



