stat でファイル情報を確認する

stat でファイル情報を確認する とは

statコマンドでファイルの種類、アクセス権、更新日時などの情報をターミナルで確認します。本レッスンでは、stat でファイル情報を確認する の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

ファイルが壊れた、思っていたサイズと違う、所有者が想定外、最終更新が古すぎる。トラブルシュートでまず欲しくなるのが「このファイルの素性」です。ls -l でも所有者・権限・サイズ・更新日時はわかりますが、もっと詳しい情報、たとえばアクセス時刻 (atime)、変更時刻 (ctime)、inode 番号、デバイス番号、ブロック数までを 1 ファイルずつ調べたいときは stat を使います。

スクリプトから「ファイルサイズだけ取りたい」「最終更新を秒数で取りたい」というニーズにも、書式指定 -c で柔軟に対応できます。バックアップ系シェルスクリプトやモニタリングで重宝するコマンドです。

基本構文

ターミナル

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

GNU stat (一般的な Linux ディストリビューションに同梱) の主要オプションは次の通りです。

オプション意味
-c FORMAT書式指定で値だけ取り出す
-Lシンボリックリンクの参照先を見る
-fファイルシステム情報を表示
--printf末尾改行なしで FORMAT 出力

FORMAT 指定子の代表例は次の通りです。

指定子内容
%nファイル名
%sサイズ (バイト)
%a権限を 8 進数 (例 644)
%A権限を文字列 (例 -rw-r--r--)
%U / %G所有者 / グループ名
%y更新日時 (人間可読)
%Y更新時刻 (Unix エポック秒)
%iinode 番号

動作の図解

diagram (will load when visible)

ファイルの実体は データ本体メタデータ (inode) に分かれています。stat はこの inode の中身を読み出して人間に見える形に整形してくれるコマンドだ、と覚えると整理しやすくなります。

代表例

何もオプションを付けないと、見やすいフルレポートが出ます。

ターミナル

$ stat /tmp/sample.txt File: /tmp/sample.txt Size: 18 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 12345 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ alice) Gid: ( 1000/ alice) Access: 2026-05-20 12:00:00 Modify: 2026-05-20 12:00:00 Change: 2026-05-20 12:00:00

スクリプトから利用する場合は -c でほしい値だけを取り出します。

ターミナル

$ stat -c '%s' /tmp/sample.txt 18 $ stat -c '%a %U %n' /tmp/sample.txt 644 alice /tmp/sample.txt

ファイル更新の差分を秒で取りたいときは %Y が便利です。date +%s と引き算するとファイルがどれくらい前のものかを計算できます。

ターミナル

$ now=$(date +%s); mtime=$(stat -c '%Y' /tmp/sample.txt); echo $((now - mtime)) 3600

よくある間違い

stat のオプションは GNU 版 (Linux) と BSD 版 (macOS) で書き方が違います。Linux では -c '%s'、macOS では -f '%z' のように書きます。スクリプトを移植する際にハマる典型ポイントなので、uname で OS を判定するか、Linux 限定であることを README に書いておくと安心です。

atime (アクセス時刻) はデフォルトで毎読み出しごとに更新されると思われがちですが、最近のディストリビューションではパフォーマンスを優先する relatime でマウントされているのが普通で、必ずしも毎読み出しでは更新されません。タイムスタンプを使った監視ロジックを書くときは、この挙動の違いを意識する必要があります。

やってみよう

ファイルを作ってからサイズと権限を stat -c で抽出してみましょう。スクリプトに組み込むときの基本動作を体得できます。

file コマンドと併用するとさらに便利

stat は「メタデータ」を取り出すコマンドですが、ファイルの「中身の種類」を判定したいときは file コマンドが便利です。バイナリと判定されたら開かない、画像と判定されたらサムネを作る、というようにスクリプトの分岐に使えます。

ターミナル

$ file /tmp/sample.txt /tmp/sample.txt: ASCII text $ file /tmp/image.png /tmp/image.png: PNG image data, 1920 x 1080

stat と file を組み合わせると「サイズが大きくて画像のもの」のような調査が一発でできます。

ls -l との対比

ls -l は速報、stat は詳細レポートと考えると整理しやすいです。次の表で対応関係を抑えておくと、出力を読み解く速度が一気に上がります。

知りたい情報ls -lstat -c
サイズ5 列目%s
権限1 列目%A または %a
所有者3 列目%U
更新時刻6 列目%y (人間可読) / %Y (epoch)
inode(表示なし)%i

まとめ

  • stat はファイルのメタデータ (inode の中身) を取り出すコマンド
  • 詳細レポートはオプション無し、スクリプト利用は -c FORMAT
  • %s サイズ、%a 権限、%Y 更新時刻 (epoch)、%U 所有者 などを覚えておく
  • BSD 版とは書式が違うので OS の違いに注意する
  • 種類を知りたいときは file コマンドを併用する

次のレッスン

次は ファイル管理チェック で、statコマンドでファイルの種類、アクセス権、更新日時などの情報をターミナルで確認します を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. stat コマンド の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. stat コマンド とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. stat -c の書式指定を使う
  2. ファイルサイズと名前を 1 行で出す

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力