概要
ls コマンドでは表示しきれない、ファイルやディレクトリのinode番号、正確なファイルサイズ、ブロック数、そして3種類のタイムスタンプ(アクセス、更新、変更時刻)などの詳細情報を網羅的に表示するコマンドです。
ファイルの属性情報だけでなく、そのファイルが保存されているファイルシステム自体の情報(タイプや空き容量など)を確認する際にも使用されます。
仕様(引数・オプション)
構文
stat [オプション] ファイル名
主な引数・オプション
| オプション | 説明 |
-L | シンボリックリンクの場合、リンクそのものではなくリンク先の情報を表示します。 |
-f | ファイルそのものではなく、ファイルが配置されているファイルシステムの状態を表示します。 |
-c <フォーマット> | 表示形式を指定したフォーマット文字列に従ってカスタマイズします(--format も同様)。 |
-t | 情報を簡潔な形式(terse形式)で出力します。シェルスクリプト処理向けです。 |
主なフォーマット指定子(-c オプション用)
| 記号 | 説明 |
%n | ファイル名 |
%a | アクセス権(8進数表記 例: 644) |
%A | アクセス権(可読形式 例: -rw-r–r–) |
%u | 所有者のユーザーID(UID) |
%U | 所有者のユーザー名 |
%g | 所有グループのグループID(GID) |
%G | 所有グループのグループ名 |
%x | 最終アクセス時刻(atime) |
%y | 最終更新時刻(mtime / 内容変更) |
%z | 最終変更時刻(ctime / 属性変更) |
基本の使い方
オプションなしで実行すると、対象ファイルの全てのメタデータが表示されます。
コマンド
# 通常のファイルの情報を表示
stat production.log
実行結果
File: production.log
Size: 2048 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 131075 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2026-01-17 10:00:00.000000000 +0900
Modify: 2026-01-16 23:55:00.000000000 +0900
Change: 2026-01-16 23:55:00.000000000 +0900
Birth: 2026-01-01 12:00:00.000000000 +0900
※ Birth(作成日時)はファイルシステムやOSのバージョンによっては表示されない場合があります。
実践コマンド
ファイルシステムの情報を確認する
ファイルそのものではなく、そのファイルが置かれているディスクパーティション(ファイルシステム)の種類やブロックサイズ、inodeの総数などを確認します。
# ファイルシステムの状態(タイプ、ブロックサイズ、inode等)を表示
stat -f /var/www/html/index.html
File: "/var/www/html/index.html"
ID: 80100000000 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 25600000 Free: 18000000 Available: 17500000
Inodes: Total: 6400000 Free: 6200000
必要な情報だけを整形して表示する(ls風)
-c オプションを使って、必要な項目だけを抽出して表示します。例えば、ls -l のような形式で、パーミッション、ユーザー、グループ、変更時刻、ファイル名を表示する例です。
# 権限、ユーザー、グループ、ctime、ファイル名を指定して表示
stat -c "%A %U %G %z %n" sample_script.sh
-rwxr-xr-x app_user app_group 2026-01-17 10:15:30.555555555 +0900 sample_script.sh
カスタムポイント
- スクリプト連携: シェルスクリプトで「ファイルの更新時刻」だけを変数に入れたい場合、
stat -c %y filenameを使うと抽出の手間が省けます。 - 秒単位の取得: タイムスタンプをUNIX時間(1970年からの秒数)で取得したい場合は、フォーマット指定子
%X(atime),%Y(mtime),%Z(ctime) を使用します。計算処理に適しています。 - 簡潔表示:
-tオプションを使うと、情報がスペース区切りで1行に表示され、テキスト処理ツール(awkなど)で扱いやすくなります。
注意点
- OSによる違い(GNU vs BSD):本記事はLinux標準のGNU版 stat コマンドについて解説しています。macOSやFreeBSDに搭載されているBSD版 stat では、オプション(例えばフォーマット指定は -f)やフォーマット記号が全く異なるため注意が必要です。
- タイムスタンプの解釈:Linuxには「作成日時(Creation Time)」を保持する標準的な仕組みが長らく存在しなかったため、環境によっては Birth 行が表示されなかったり、空欄(-)になったりすることがあります。
- 時刻の精度:ls -l では分単位までしか表示されないことが多いですが、stat ではナノ秒単位まで詳細に記録されていることが確認できます。
応用
特定ディレクトリ内の全ファイルの権限と所有者を一覧化する
find コマンドと組み合わせることで、ディレクトリツリー内のファイルの権限設定状況をCSV形式のように出力し、監査レポートとして利用できます。
# カレントディレクトリ以下の全ファイルについて「8進数権限,所有者,ファイル名」を出力
find . -type f -exec stat -c "%a,%U,%n" {} \;
644,root,./etc/config.json
755,www-data,./var/www/html/index.php
600,mysql,./var/lib/mysql/ibdata1
まとめ
statコマンドは、ファイル管理において「lsコマンドの解像度」では足りない場面で真価を発揮します。特にシステムトラブルシューティングにおいて、inodeの枯渇状況を確認したり、ファイルの変更時刻をナノ秒単位で突き合わせて前後関係を特定したりする際に必須となります。フォーマット指定機能を活用することで、監視スクリプトや監査ログの生成にも柔軟に対応できるため、基本的なオプションと指定子を把握しておくと効率的な運用が可能になります。
