stat コマンド

statコマンドはファイルやファイルシステムの詳細情報を表示するコマンド。

$ stat test.txt
  File: test.txt
  Size: 18        	Blocks: 8          IO Block: 4096   regular file
Device: 1,17	Inode: 219222175   Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/     sue)   Gid: (    0/   wheel)
Access: 2026-01-13 00:03:58.731037436 +0900
Modify: 2026-01-13 00:03:58.731137019 +0900
Change: 2026-01-13 00:03:58.731137019 +0900
 Birth: 2026-01-13 00:03:58.731037436 +0900

ファイルの詳細情報が表示される。

表示される情報

statコマンドは以下の情報を表示する。

  • File: ファイル名
  • Size: ファイルサイズ(バイト単位)
  • Blocks: 使用しているブロック数
  • IO Block: I/Oブロックサイズ
  • Device: デバイス番号
  • Inode: inode番号(ファイルシステム内で一意な識別子)
  • Links: ハードリンク数
  • Access (permissions): アクセス権限(8進数と記号表記)
  • Uid: ユーザーID(数値と名前)
  • Gid: グループID(数値と名前)
  • Access: 最終アクセス時刻
  • Modify: 最終更新時刻(ファイル内容の変更)
  • Change: 最終更新時刻(メタデータの変更)
  • Birth: 作成時刻(ファイルシステムによって表示される)

タイムスタンプの種類

ファイルには3種類のタイムスタンプがある。

Access(atime)

ファイルへ最後にアクセスした時刻。ファイルを読み取ると更新される。

$ cat test.txt
$ stat test.txt | grep Access:
Access: 2026-01-13 00:10:23.123456789 +0900

catコマンドでファイルを読むと、Access時刻が更新される。

Modify(mtime)

ファイルの内容を最後に変更した時刻。ファイルに書き込むと更新される。

$ echo "new line" >> test.txt
$ stat test.txt | grep Modify:
Modify: 2026-01-13 00:11:45.234567890 +0900

ファイル内容を変更すると、Modify時刻が更新される。

Change(ctime)

ファイルのメタデータを最後に変更した時刻。権限変更やリネームで更新される。

$ chmod 755 test.txt
$ stat test.txt | grep Change:
Change: 2026-01-13 00:12:34.345678901 +0900

権限を変更すると、Change時刻が更新される。ファイル内容を変更した場合もメタデータ(サイズなど)が変わるため、ChangeとModifyは同時に更新される。

フォーマット指定(Linux / GNU stat)

Linux(GNU stat)では-cオプションでカスタムフォーマットを指定できる。

基本的なフォーマット指定

$ stat -c "%n %s %y" test.txt
test.txt 18 2026-01-13 00:03:58.731137019 +0900
  • %n: ファイル名
  • %s: ファイルサイズ(バイト)
  • %y: 最終更新時刻

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

$ stat -c "ファイル: %n, サイズ: %s bytes, 権限: %A" test.txt
ファイル: test.txt, サイズ: 18 bytes, 権限: -rw-r--r--

主なフォーマット指定子は以下である。

  • %n: ファイル名
  • %s: ファイルサイズ(バイト)
  • %b: ブロック数
  • %i: inode番号
  • %a: アクセス権限(8進数)
  • %A: アクセス権限(記号表記)
  • %u: ユーザーID
  • %U: ユーザー名
  • %g: グループID
  • %G: グループ名
  • %x: 最終アクセス時刻
  • %y: 最終更新時刻
  • %z: 最終変更時刻
  • %w: 作成時刻
  • %F: ファイルタイプ

ファイルサイズのみ取得

$ stat -c %s test.txt
18

ファイルサイズだけを出力できる。

inode番号のみ取得

$ stat -c %i test.txt
219222175

inode番号だけを出力できる。

権限を8進数で取得

$ stat -c %a test.txt
644

権限を8進数で取得できる。chmodコマンドで使用する形式である。

macOS での違い

macOS標準のstatコマンド(BSD版)ではオプションが異なる。

macOS での基本的な使い方

$ /usr/bin/stat test.txt
16777233 219222175 -rw-r--r-- 1 sue wheel 0 18 "Jan 13 00:03:58 2026" "Jan 13 00:03:58 2026" "Jan 13 00:03:58 2026" "Jan 13 00:03:58 2026" 4096 8 0 test.txt

macOSのstatコマンドは一行で情報を出力する。

macOS でのフォーマット指定

macOSでは-fオプションでフォーマットを指定する。

$ /usr/bin/stat -f "%N %z %Sm" test.txt
test.txt 18 Jan 13 00:03:58 2026
  • %N: ファイル名
  • %z: ファイルサイズ
  • %Sm: 最終更新時刻

macOSでファイルサイズのみ取得できる。

$ /usr/bin/stat -f %z test.txt
18

macOSでinode番号のみ取得できる。

$ /usr/bin/stat -f %i test.txt
219222175

macOSで権限を8進数で取得できる。

$ /usr/bin/stat -f %Lp test.txt
644

GNU stat のインストール

macOSでLinux互換のstatコマンドを使いたい場合は、GNU coreutilsをインストールする。

$ brew install coreutils
$ gstat -c %s test.txt
18

GNU版はgstatコマンドとしてインストールされる。

シンボリックリンクの扱い

シンボリックリンクに対してstatコマンドを実行すると、リンク自体の情報が表示される。

$ ln -s test.txt link_to_test.txt
$ stat link_to_test.txt
  File: link_to_test.txt -> test.txt
  Size: 13        	Blocks: 0          IO Block: 4096   symbolic link
Device: 1,17	Inode: 219222457   Links: 1
Access: (0755/lrwxr-xr-x)  Uid: (  501/     sue)   Gid: (    0/   wheel)
Access: 2026-01-13 00:05:38.574710761 +0900
Modify: 2026-01-13 00:05:38.574710761 +0900
Change: 2026-01-13 00:05:38.574794095 +0900
 Birth: 2026-01-13 00:05:38.574710761 +0900

ファイルタイプがsymbolic linkで、リンク先が表示される。

リンク先の情報を取得(-L)

-Lオプションを使うと、リンク先のファイル情報を表示できる。

$ stat -L link_to_test.txt
  File: link_to_test.txt
  Size: 18        	Blocks: 8          IO Block: 4096   regular file
Device: 1,17	Inode: 219222175   Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/     sue)   Gid: (    0/   wheel)
Access: 2026-01-13 00:03:58.731037436 +0900
Modify: 2026-01-13 00:03:58.731137019 +0900
Change: 2026-01-13 00:03:58.731137019 +0900
 Birth: 2026-01-13 00:03:58.731037436 +0900

リンク先であるtest.txtの情報が表示される。inode番号がリンク元のファイルと同じである。

terse 形式(-t)

-tオプションを使うと、機械的に処理しやすい簡潔な形式で出力される。

$ stat -t test.txt
test.txt 18 8 81a4 501 0 1000011 219222175 1 0 0 1768230238 1768230238 1768230238 1768230238 4096

各フィールドがスペース区切りで一行に出力される。スクリプトでの処理に便利である。

複数ファイルの情報を取得

複数のファイルを指定すると、それぞれの情報が表示される。

$ stat file1.txt file2.txt file3.txt

複数ファイルの情報がまとめて表示される。

フォーマット指定と組み合わせると、複数ファイルの特定情報を一覧表示できる。

$ stat -c "%n: %s bytes" *.txt
file1.txt: 18 bytes
file2.txt: 256 bytes
file3.txt: 1024 bytes

ディレクトリ内のファイルサイズを一覧表示できる。

ファイルシステムの情報を表示(-f)

Linux(GNU stat)では-fオプションを使うと、ファイルではなくファイルシステムの情報を表示する。

$ stat -f /home
  File: "/home"
    ID: a3b2c1d0e0f0g0h0 Namelen: 255     Type: ext4
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 12345678   Free: 6789012   Available: 5678901
Inodes: Total: 3145728   Free: 2876543

ファイルシステムの容量、使用可能なブロック数、inode数などが表示される。

具体例

ファイルサイズの合計を計算する

$ stat -c %s *.log | awk '{sum+=$1} END {print sum}'
1048576

カレントディレクトリの全ログファイルのサイズ合計をバイト単位で計算できる。

最終更新時刻でファイルをソートする

$ stat -c "%y %n" *.txt | sort
2026-01-10 10:23:45.123456789 +0900 old.txt
2026-01-12 15:30:12.234567890 +0900 recent.txt
2026-01-13 00:03:58.731137019 +0900 newest.txt

ファイルを更新時刻順にソートして表示できる。

同じinodeを持つファイルを確認する

ハードリンクされたファイルは同じinode番号を持つ。

$ ln test.txt hardlink.txt
$ stat -c "%i %n" test.txt hardlink.txt
219222175 test.txt
219222175 hardlink.txt

同じinode番号が表示されるため、ハードリンクであることが確認できる。

ファイルの権限を確認する

$ stat -c "ファイル: %n, 権限: %a (%A)" /etc/passwd
ファイル: /etc/passwd, 権限: 644 (-rw-r--r--)

ファイルの権限を8進数と記号表記の両方で確認できる。

特定の権限を持つファイルを検索する

$ find /var/www -type f -exec stat -c "%a %n" {} \; | grep "^777"
777 /var/www/uploads/temp.txt

権限が777のファイルを検索できる。セキュリティチェックに有用である。

タイムスタンプを比較する

$ stat -c "Access: %x, Modify: %y, Change: %z" test.txt
Access: 2026-01-13 00:03:58.731037436 +0900, Modify: 2026-01-13 00:03:58.731137019 +0900, Change: 2026-01-13 00:03:58.731137019 +0900

3種類のタイムスタンプを並べて確認できる。

ファイルが変更されたか確認する

$ stat -c %Y /var/log/app.log
1768230238

%YでModify時刻をUnixタイムスタンプ(エポック秒)で取得できる。スクリプトで時刻比較する場合に便利である。

#!/bin/bash
last_modified=$(stat -c %Y /var/log/app.log)
current_time=$(date +%s)
diff=$((current_time - last_modified))

if [ $diff -gt 3600 ]; then
  echo "ログファイルが1時間以上更新されていない"
fi

ファイルが一定時間、更新されていないことを検知できる。