stat コマンド入門 - ファイルメタ情報を読み解く
stat コマンドでわかること
stat は ls -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 出力には Access、Modify、Change の 3 つのタイムスタンプが表示される。これらは似ているようで意味が異なる。
| タイムスタンプ | 略称 | 更新タイミング |
|---|---|---|
Access |
atime | ファイルを読んだとき |
Modify |
mtime | ファイルの内容を変更したとき |
Change |
ctime | inode の属性を変更したとき(mtime 更新でも変わる) |
Birth |
btime | ファイルを作成したとき(fs によっては未サポート) |
ctime は「作成時刻」ではない
Change は "creation" の略ではなく "change" の略。chmod や chown を実行した場合も ctime は更新される。ファイル作成時刻が欲しい場合は Birth(btime)を使うが、ext4 以外のファイルシステムでは -- と表示されることがある。
atime の性能上の注意
多くの Linux では atime 更新がディスク書き込みを発生させる。高頻度アクセスのシステムでは /etc/fstab の noatime オプションで無効化されていることが多い。
$ 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