Linux / コマンド / stat - ファイル情報とメタデータの確認

statは、ファイルやディレクトリのサイズ、権限、所有者、inode、ハードリンク数、割り当てブロック、そして複数のタイムスタンプを詳しく表示するコマンドです。ls -lより多くのメタデータを確認でき、必要なフィールドだけを一定の形式で出力してシェルスクリプトで使うことにも適しています。

この記事ではGNU Coreutilsのstatを基準に、基本的な出力の読み方、atime·mtime·ctime·Birthの違い、シンボリックリンク、ファイルシステム情報、そして--formatの活用方法を説明します。

statコマンドとは?

statはファイルの内容ではなく、ファイルシステムが管理する状態情報、すなわちメタデータを参照します。調べたいファイルやディレクトリを引数として指定すれば良いです。

stat report.txt
stat /etc
stat /usr/bin/bash

ファイルを直接読み込んで内容を分析するfile による内容からの形式推定とは目的が異なります。fileは形式を推定し、statはサイズ・権限・所有権・時間・inodeなどのファイルシステム情報を表示します。

基本的な文法と使い方

stat [オプション] ファイル ...

ファイル一つだけでなく、複数のパスを一度に指定することもできます。

stat file1.txt file2.txt
stat src tests
stat "annual report.pdf"

ハイフンで始まるファイル名はオプションと誤解されないように、--の後に指定します。

stat -- -sample.txt

以下のコマンドでGNU statのバージョンと対応オプションを確認できます。

stat --version
stat --help
info '(coreutils) stat invocation'

基本出力の読み方

通常のファイルに対してstatを実行すると、以下のような情報が得られます。実際の値はファイルシステムやオペレーティングシステムによって異なります。

  File: report.txt
  Size: 4096       Blocks: 8          IO Block: 4096   regular file
Device: 8,1        Inode: 1234567     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/ user)   Gid: ( 1000/ user)
Access: 2026-09-21 10:15:30.000000000 +0900
Modify: 2026-09-21 10:14:02.000000000 +0900
Change: 2026-09-21 10:14:02.000000000 +0900
 Birth: 2026-09-20 19:42:11.000000000 +0900

それぞれのアイテムには以下の意味があります。

項目 意味
File 閲覧したファイル名やディレクトリ名です。
Size ファイルの論理サイズ。通常はバイトで表されます。
Blocks ファイルに割り当てられるブロック数。スパースファイルや圧縮ファイルシステムでは、論理サイズと実際の割り当ての差が大きくなることがあります。
IO Block 効率的な入出力のための推奨ブロックサイズ情報。
Device ファイルが属するデバイスを識別する番号です。
Inode 該当ファイルシステム内でファイルメタデータを識別するinode番号です。
Links 同じinodeを指すハードリンクの数です。
Access 8進数および記号形式の権限とファイルタイプを示します。
Uid, Gid 所有ユーザーとグループの数字IDおよび名前です。
Access, Modify, Change, Birth アクセス、内容修正、状態変更および作成日時に関するタイムスタンプです。

ls -lとstatの違い

比較項目 ls -l stat
主な目的 複数のファイルをリスト形式で素早く比較します。 指定したファイルの詳細なメタデータを確認します。
基本時間 主に更新時刻を簡潔に表示します。 アクセス・修正・状態変更・作成時刻を区別して表示します。
inodeとブロック オプションを追加しなければ一部の情報は見られません。 基本出力では、inode、リンク数、割り当てブロックなどを表示します。
スクリプト出力 人が読むリストの解析は環境によって不安定になることがあります。 --formatで必要なフィールドを直接指定できます。
ファイルシステム情報 直接提供しません。 -fでファイルが位置するファイルシステムの状態を表示します。

複数のファイルの名前、サイズ、権限を見る場合はls -lが便利で、単一ファイルの正確なフィールドや自動化に使用する値が必要な場合はstatが適しています。

ファイルサイズと割り当てブロックを理解する

論理的サイズを確認する

基本出力のSizeはファイルが示す全バイト数です。必要な値だけ出力したい場合は%sを使用します。

stat -c '%s' disk.img
stat -c '%n: %s bytes' file1 file2

ディレクトリのSizeは、その中にあるすべてのファイルの合計ではありません。ディレクトリエントリを保存するディレクトリ自体のサイズです。配下の使用量は du によるディレクトリ容量の集計で確認してください。

割り当てられた空間を計算する

%bは割り当てられたブロック数、%Bはそのブロック1個のバイトサイズを出力します。

stat -c 'size=%s blocks=%b block-size=%B' disk.img

おおよその割り当てバイト数は%b × %Bで計算できます。スパースファイルは論理的サイズより実際の割り当て空間がはるかに小さい場合があり、ファイルシステムの圧縮や共有ブロックなどの機能があると、この値だけで物理ストレージの使用量を断定するのは難しいです。

権限と所有者を確認する

8進数の権限と記号権限を出力する

%aは8進数の権限を、%Aはファイルの種類を含む人間が読みやすい権限を出力します。

stat -c '%a %A %n' script.sh

出力は次のような形式になることがあります。

755 -rwxr-xr-x script.sh

所有者とグループを出力する

%Uと%Gはユーザー名とグループ名を、%uと%gは数字のUIDとGIDを出力します。

stat -c 'owner=%U(%u) group=%G(%g)' report.txt

数字IDに対応する名前を見つけられない環境では、名前フィールドが異なる表示になることがあります。

inodeとハードリンクを確認する

inode番号を出力する

%iはファイルシステム内でファイルを識別するinode番号を出力します。

stat -c '%i %n' report.txt

inode番号はファイルシステムの境界を越えてグローバルに一意ではありません。同じファイルかどうかを比較するには、デバイス情報とinodeを一緒に考慮する必要があります。

ハードリンク数を確認する

%h はその inode を指すハードリンクの数です。以下は ハードリンクの作成と比較で用意した同じファイルへの別名を確認する例です。

stat -c 'inode=%i links=%h name=%n' original.txt copy-link.txt

2つのパスのデバイスとinodeが同じであれば、同じファイルデータを指すハードリンクである可能性があります。シンボリックリンクは別のinodeを持つため、同じ方法では判断しません。

atime、mtime、ctimeとBirthの違い

タイムスタンプの名前は似ていますが、記録する事象が異なります。特にctimeを作成時刻と誤解しないことが重要です。

時間 意味 変更される可能性のある例
atime ファイルデータに最後にアクセスした時刻です。 ファイルを読む。ただし、マウントオプションとキャッシュポリシーによっては毎回更新されない場合があります。
mtime ファイル内容が最後に修正された時刻です。 ファイルデータの書き込みまたは内容の長さの変更。
ctime inode状態情報が最後に変更された時刻です。 権限・所有者・リンク数の変更、名前の変更など。作成時刻ではありません。
Birth ファイルが作成された時刻です。 対応している場合、作成時に一度記録され、一般的な状態変更では変わりません。

人が読む時間を出力する

%x、%y、%z、%wは、それぞれatime、mtime、ctimeおよびBirthを人間が読みやすい形式で出力します。

stat -c 'atime=%x
mtime=%y
ctime=%z
birth=%w' report.txt

Birthをサポートしていない、または値を取得できないファイルシステムでは、%wはハイフンで表示されることがあります。

エポック秒単位で出力する

大文字の%X、%Y、%Z、%Wは、それぞれの時間をUnix エポック(1970年1月1日 00:00:00 UTC)以降の秒単位で出力します。

stat -c 'atime=%X mtime=%Y ctime=%Z birth=%W' report.txt

Birthが不明な場合、%Wは0を出力します。ソートや数字比較にはエポック値が便利ですが、ファイルシステムとOSが提供する時間精度の差を考慮する必要があります。

シンボリックリンク情報を確認する

リンク自体のメタデータを見る

GNU statは、基本的にシンボリックリンクに従わず、リンク自体を調査します。

stat current.log
stat -c '%N | inode=%i | type=%F' current.log

%Nはリンクの場合、対象とともに引用されたファイル名を表示することができます。

-Lでリンク先のメタデータを表示

-Lまたは--dereferenceを使用すると、リンクが指す実際の対象の状態を確認できます。

stat -L current.log
stat -L -c '%n | inode=%i | type=%F | size=%s' current.log

壊れたシンボリックリンクは対象を確認できないため、-L使用時にエラーが発生します。

必要なフィールドのみを出力する

-cおよび--formatを使用する

-cまたは--formatは指定した形式で結果を出力し、各ファイルごとに改行を追加します。

stat -c '%n %s %a %U:%G' file1 file2
stat --format='name=%n type=%F inode=%i' report.txt

形式文字列はシェルが解釈しないように、シングルクォートで囲むのが安全です。

--printfで複数行を構成する

--printfはバックスラッシュのエスケープを解釈しますが、自動で改行は追加しません。必要な位置に\nを直接入れます。

stat --printf='name=%n\nsize=%s\nmode=%a\n' report.txt

複数のファイルを処理する場合、ファイル間の区切りも形式文字列に含める必要があります。

よく使うフォーマット指定子

指定子 出力内容
%n ファイル名です。
%N 引用されたファイル名で、シンボリックリンクの場合は対象情報も含めることができます。
%F 通常ファイル、ディレクトリ、シンボリックリンクなどの種類です。
%s ファイルの論理サイズ(バイト数)です。
%b 割り当てられたブロックの数。
%B %b で数える1ブロックあたりのバイト数です。
%a 8進数のアクセス権です。
%A ファイルの種類と、rwx などの記号形式のアクセス権です。
%u, %g 所有ユーザーの ID(UID)と所有グループの ID(GID)です。
%U, %G 所有ユーザー名と所有グループ名です。
%i inode 番号です。
%h ハードリンクの数です。
%m ファイルが属するマウントポイントです。
%x, %X 最後のアクセス時刻を人間が読み取れる形式またはエポック秒で表示します。
%y, %Y 最後の内容変更時刻を人間が読み取れる形式またはエポック秒で表示します。
%z, %Z 最後の状態変更時刻を人間が読み取れる形式またはエポック秒で表示します。
%w, %W 作成時刻を人間が読み取れる形式またはエポック秒で表示し、わからない場合はハイフンまたは 0 です。
%C サポートされている環境で SELinux セキュリティコンテキストを表示します。

ファイルシステム情報の確認

-fでファイルシステムの状態を見る

-fまたは--file-systemを使用すると、ファイル自体ではなく、該当パスが存在するファイルシステムの情報を出力します。

stat -f /
stat --file-system /home

ファイルシステムの種類、全ブロック数、使用可能なブロック数、inode数、最大ファイル名の長さなどを確認できます。

ファイルシステムフォーマット指定子の使用

-fモードでは、ファイル用の指定子とは意味が異なります。例えば、%Tは人間が読めるファイルシステムの種類、%bは全データブロック、%aは一般ユーザーが使用可能なブロック数を表します。

stat -f -c 'type=%T total=%b available=%a block-size=%S' /

人間が読めるディスク使用量を比較したい場合はdf -hが便利で、オートメーションに必要なファイルシステムフィールドだけを抽出したい場合はstat -f -cが有用です。

リモートファイルシステムとキャッシュポリシー

サポートされているGNU Coreutilsバージョンでは、--cached=MODEを使ってリモートファイルシステムのプロパティをクエリする際のキャッシュの使い方を指定できます。

モード 動作
default ファイルシステムの既定のキャッシュ方針に従います。
always 可能であればキャッシュされた属性を使用します。最新の状態とは限りません。
never 可能であれば最新の属性と同期するよう要求します。リモートアクセスの遅延が長くなることがあります。
stat --cached=never /mnt/remote/report.txt

実際の対応範囲は Network File System(NFS)などのリモートファイルシステムやマウント設定によって異なります。インストールしたバージョンがこのオプションに対応しているかstat --helpを確認してください。

シェルスクリプトの使用例

archive.tar、file-a、file-b は自分が読み取れる実在するテストファイルに置き換えます。コードを Bash スクリプトとして保存して実行します。サイズの例は 100 MiB を超えた場合だけ表示し、時刻比較は file-a の整数秒の更新時刻が大きい場合だけ表示します。同じ秒内の変更はこの比較だけで区別できません。どちらも stat の取得失敗時は状態 1 で停止します。

ファイルサイズによる分岐

path='archive.tar'
size=$(stat -c '%s' -- "$path") || exit 1

if [ "$size" -gt 104857600 ]; then
  printf '%s\n' '100 MiBより大きいファイルです.'
fi

ファイルが検査と使用の間に変更される可能性がある環境では、一度確認したメタデータがその後の作業までそのまま保持されると仮定しないでください。

修正時刻を数値で比較する

left_mtime=$(stat -c '%Y' -- file-a) || exit 1
right_mtime=$(stat -c '%Y' -- file-b) || exit 1

if [ "$left_mtime" -gt "$right_mtime" ]; then
  printf '%s\n' 'file-a のほうが最近更新されました.'
fi

バックアップや配布の判断を時刻だけに依存すると、時計のずれや復元されたタイムスタンプと同時修正によって問題が発生する可能性があります。必要であれば、チェックサムやバージョン情報も併せて使用してください。

よく使う stat コマンド

コマンド 用途
stat ファイル ファイルの主なメタデータを表示します。
stat -L リンク シンボリックリンクが指す対象の情報を表示します。
stat -c '%s' ファイル ファイルサイズをバイト単位で出力します。
stat -c '%a %n' ファイル 8進数の権限とファイル名を出力します。
stat -c '%U:%G' ファイル 所有ユーザーとグループを出力します。
stat -c '%i %h %n' ファイル inode、ハードリンク数とファイル名を出力します。
stat -c '%y' ファイル 最後の内容変更時刻を出力します。
stat -c '%Y' ファイル 最後の内容変更時刻をEpoch秒で出力します。
stat -f パス 該当パスが存在するファイルシステム情報を表示します。
stat -t ファイル フィールドが固定された簡潔な一行形式で出力します。

使用する際の注意点

ctimeは作成日時ではありません

ctimeはchange time、すなわちファイルの状態情報が変更された時刻です。creation timeの略ではなく、作成時刻は別のBirthフィールドで提供される場合があります。

Birthとatimeは常に期待した値ではありません

作成時刻はファイルシステム、カーネルとマウント方式によってサポートされない場合があります。atimeもnoatime、relatimeのようなマウントポリシーやキャッシュのため、ファイルを読むたびに即座に更新されないことがあります。

出力文を直接パースしない

デフォルトの出力は人間向けの形式で、OS、Coreutilsのバージョンやロケールによって異なる場合があります。自動化では-cを使って必要なフィールドだけを選択し、ファイル名に空白や改行のような文字が含まれる可能性も考慮してください。

FAQ

ファイルの8進数権限だけを確認するにはどうすればいいですか?

stat -c '%a' ファイル名を使用します。ファイル名も必要な場合はstat -c '%a %n' ファイル名を使用してください。

mtimeとctimeの違いは何ですか?

mtimeはファイル内容が最後に修正された時刻で、ctimeは権限・所有権・リンク数などのinode状態が最後に変更された時刻です。ctimeはファイル作成時刻ではありません。

Birthがハイフンで表示される理由は何ですか?

使用しているファイルシステムやOSが作成時刻を提供していない、またはstatがその値を取得できなかったためです。この場合%wはハイフン、%Wは0を出力します。

ディレクトリのSizeは内部ファイルの全体サイズですか?

いいえ。ディレクトリエントリを保持するディレクトリ自体のサイズです。ディレクトリ以下のファイルが使用する全体の容量を確認するにはdu -sh ディレクトリを使用してください。

参考資料