Linux 講座 / ファイルの種類と情報の確認 - ls, file, stat, readlink

ファイル名や拡張子だけで Linux ファイルの種類を確定することはできません。ls -l はディレクトリ・通常のファイル・リンクなどの項目の種類と基本属性を示し、file はファイル内容を検査して形式を推測し、stat はサイズ・権限・時刻・inode などのメタデータを確認します。この講座では、3 つの結果がそれぞれ何を意味するかを区別する方法を学びます。

inode とファイル種類を確認した後は、ハードリンクとシンボリックリンクの比較実習で、名前・inode・リンク先がどのように異なるかを確認できます。

Linux でいうファイルの種類

Linux では通常の文書だけでなく、ディレクトリ、シンボリックリンク、デバイスなどもファイルシステムの項目として表現されます。ls -l の出力の最初の文字は、その項目の種類を教えてくれます。拡張子 .txt や .jpg は名前の一部に過ぎず、この最初の文字と同じ情報ではありません。

最初の文字 種類 例
- 通常のファイル 文書、実行ファイルなど
d ディレクトリ ファイルを入れるパス
l シンボリックリンク 他のパスを指す項目
c, b 文字デバイス、ブロックデバイス /dev の下のデバイス項目
p, s FIFO(名前付きパイプ)、ソケット プロセス間通信に使われる項目

実際の項目の種類を確認するには、ls -ldを対象に指定してください。ディレクトリにls -lだけを適用すると、ディレクトリ自体ではなくその中の項目が一覧表示されることがあります。

ls -ld /etc /etc/passwd

出力では、/etc行は通常d、/etc/passwd行は-で始まります。その後に権限、リンク数、所有者、グループ、サイズ、修正日時や名前などが続きます。正確な値や表示形式はシステムによって異なります。

fileで内容に応じた形式を推定する

fileは、ファイルシステム上の項目の種類やファイル内容の特徴を調べ、人が読みやすい説明を出力します。例えば拡張子がない/etc/passwdも、テキストファイルとして分類されることがあります。

file /etc/passwd

出力は次のようになることがあります。実際のエンコーディングや実装によって文言は異なります。

/etc/passwd: ASCII text

fileの説明は、ファイルの内容を検査した判別結果であり、ファイル形式の正しさを保証するものではありません。テキストのエンコーディングやファイル形式の詳細な判定は、検査ルールによって異なる場合があります。シンボリックリンク自体を表示するか、対象ファイルをたどるかはオプションや環境によって異なるため、リンクを調べるときはfile -h リンクとfile -L リンクの違いを確認してください。

statでメタデータを確認する

statはファイルの内容ではなく、ファイルシステムが管理する情報を表示します。ファイルサイズ、権限、所有者、inode番号、リンク数、さまざまな時刻を確認できます。inodeは、ファイルシステムがアイテムのメタデータを管理するときに使用する識別単位であり、名前自体とは区別されます。

stat /etc/passwd

出力が長くなる場合は、GNU statの-cオプションで必要な値だけを見ることができます。以下の例の%Fはファイル種類、%sはバイト単位のサイズ、%nは名前です。

stat -c '%F | %s bytes | %n' /etc/passwd

出力は以下のような1行です。1234は形式を説明するための仮のサイズであり、実際のサイズや表示言語はシステムによって異なります。

regular file | 1234 bytes | /etc/passwd

最初の部分はファイルの種類が通常ファイルであることを、中央部分はファイルサイズがバイト単位で表示されることを、最後の部分は調査したパスが/etc/passwdであることを意味します。基本statの出力にあるAccess(アクセス)、Modify(内容修正)、Change(メタデータ変更)、Birth(作成)時刻は、それぞれ異なる意味があります。特にChangeを『作成時刻』として読まないでください。Birthはファイルシステムやツールが提供しない場合もあります。

シンボリックリンクに遭遇したとき

シンボリックリンクは、別のパスを指す独立した項目です。ls -lは通常リンク名 -> 対象の形式で表示されます。readlink リンク名はリンク内に保存された対象パスの文字列を出力し、その文字列が相対パスであれば、リンクがあるディレクトリを基準に解釈する必要があります。

リンク自身のメタデータとリンクが指すファイルのメタデータは異なります。GNU statでリンク自身を見たい場合は基本動作を、リンク先をたどる場合は-Lを使用します。リンクが切れている場合は、対象をたどるチェックは失敗することがあります。実習用リンクを作成する過程はリンク講座で扱います。

どのコマンドを選びますか?

  • リストで種類と基本属性を確認: ls -l または対象自体を見る ls -ld
  • 内容に基づいてファイル形式を推測: file
  • サイズ・日時・inodeなど詳細な属性を確認: stat
  • シンボリックリンクに記録された対象のパスを確認: readlink

コマンドごとの例は fileで形式を確認する、statでメタデータを確認する、readlinkでリンク対象を確認する で詳しく見ることができます。

公式ドキュメント

file(1) マニュアル、GNU stat ドキュメント、GNU readlink ドキュメントでコマンドのオプションと例外を確認できます。