stat コマンド入門 - ファイルメタ情報を読み解く

stat コマンド入門 - ファイルメタ情報を読み解く

stat コマンドでわかること

statls -l より詳細なファイルメタ情報を 1 コマンドで取得できる。タイムスタンプ・inode・ハードリンク数・ブロック数まで、ファイルシステムが記録するすべての属性を確認できる。

結論(実務の型)

  • タイムスタンプを確認したい → stat filename
  • スクリプトで特定フィールドだけ欲しい → stat -c "%Y" filename(更新時刻の Unix 時刻)
  • ファイルシステムの残り容量・inode 数を確認 → stat -f /path

stat の基本的な使い方

$ stat /etc/hosts
  File: /etc/hosts
  Size: 220             Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 1179676     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2026-05-28 09:12:34.000000000 +0900
Modify: 2026-03-10 14:22:05.000000000 +0900
Change: 2026-03-10 14:22:05.000000000 +0900
 Birth: 2025-01-15 08:00:00.000000000 +0900

ファイル名・サイズ・inode 番号・パーミッション・所有者・3 種のタイムスタンプが一覧表示される。

出力フィールドを読む

フィールド 意味
Size バイト単位のファイルサイズ
Blocks 512 バイトブロック単位の実使用量
IO Block ファイルシステムのブロックサイズ
Inode inode 番号(ファイルシステム内の一意識別子)
Links ハードリンク数
Access (0644/...) パーミッション(8 進数表記と記号表記)
Uid / Gid 所有ユーザーとグループ

Blocks は実際にディスク上で使用している 512 バイトブロックの数。Size より大きくなることがある(ブロック境界のアライメントによる)。

タイムスタンプ 3 種の違いを理解する

stat 出力には AccessModifyChange の 3 つのタイムスタンプが表示される。これらは似ているようで意味が異なる。

タイムスタンプ 略称 更新タイミング
Access atime ファイルを読んだとき
Modify mtime ファイルの内容を変更したとき
Change ctime inode の属性を変更したとき(mtime 更新でも変わる)
Birth btime ファイルを作成したとき(fs によっては未サポート)

ctime は「作成時刻」ではない

Change は "creation" の略ではなく "change" の略。chmodchown を実行した場合も ctime は更新される。ファイル作成時刻が欲しい場合は Birth(btime)を使うが、ext4 以外のファイルシステムでは -- と表示されることがある。

atime の性能上の注意

多くの Linux では atime 更新がディスク書き込みを発生させる。高頻度アクセスのシステムでは /etc/fstabnoatime オプションで無効化されていることが多い。

$ grep noatime /etc/fstab

inode 番号の活用

inode 番号は同一ファイルシステム内でファイルを一意に識別する数値。ハードリンクは同じ inode を指す。

$ stat /etc/hosts | grep Inode
    Inode: 1179676
# ハードリンクを作成して inode が同じか確認
$ ln file.txt hardlink.txt
$ stat -c "%i %n" file.txt hardlink.txt
1234567 file.txt
1234567 hardlink.txt

Links カウントが 2 になり、2 つの名前(ディレクトリエントリ)が同じ inode を指していることが確認できる。

フォーマットオプションで必要な情報だけ取り出す

スクリプトで使う場合は -c(または --format)で出力形式を指定する。

# ファイルサイズ(バイト)
$ stat -c "%s" /var/log/syslog
1048576

# 最終更新時刻(Unix タイムスタンプ)
$ stat -c "%Y" /var/log/syslog
1748700000

# パーミッション(8 進数)と所有者
$ stat -c "%a %U" /etc/hosts
644 root

# 複数フィールドを整形して出力
$ stat -c "Name: %n | Size: %s bytes | Modified: %y" /etc/hosts
Name: /etc/hosts | Size: 220 bytes | Modified: 2026-03-10 14:22:05.000000000 +0900

主なフォーマット指定子:

指定子 意味
%n ファイル名
%s バイトサイズ
%a パーミッション(8 進数)
%A パーミッション(記号表記、例: -rw-r--r--
%U 所有ユーザー名
%G 所有グループ名
%i inode 番号
%y 最終更新時刻(人間が読みやすい形式)
%Y 最終更新時刻(Unix タイムスタンプ)
%x 最終アクセス時刻
%z 最終属性変更時刻
%h ハードリンク数

%y%Y の違いに注意。小文字 %y は人間が読みやすいタイムスタンプ、大文字 %Y は Unix 時刻(エポック秒)。スクリプトで比較・計算する場合は %Y を使う。

ファイルシステム情報を取得する

-f オプションを付けるとファイル単体ではなくファイルシステム全体の情報を取得する。

$ stat -f /
  File: "/"
    ID: fd0000000000 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 20000000  Free: 12000000  Available: 11000000
Inodes: Total: 5000000   Free: 4800000
フィールド 意味
Block size ファイルシステムのブロックサイズ
Blocks: Total/Free/Available 総ブロック数・空きブロック数・非 root で使える空き
Inodes: Total/Free inode の総数と残数

inode の残数(Inodes: Free)がゼロに近い場合、「ディスクに容量があるのに書き込めない」障害が発生する。df -i でも同様に確認できる。inode 枯渇はログファイル大量生成や一時ファイル放置によって起きやすい。

実践的なユースケース

ファイルが最後にいつ変更されたか確認する

$ stat -c "%y" /etc/nginx/nginx.conf
2026-04-01 10:30:00.000000000 +0900

バックアップ前に mtime を記録しておく

$ stat -c "%Y %n" /important/data.db
1748700000 /important/data.db

複数ファイルの更新時刻を比較する

$ for f in /etc/nginx/*.conf; do stat -c "%Y %n" "$f"; done | sort -n
1748600000 /etc/nginx/mime.types
1748700000 /etc/nginx/nginx.conf

パーミッションを数値で確認する

$ stat -c "%a" /etc/hosts
644

次に読む