UNIX/Linuxの部屋 statコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド stat ファイルの詳細な情報を表示する (ファイルサイズ・パーミッション・タイムスタンプ等) このエントリーをはてなブックマークに追加

最終更新


stat コマンドは、ファイル名、ファイルサイズ、ブロック数、ファイルタイプ (ファイル、ディレクトリ、named pipeなど)、パーミッション、UID、GID、i-node、リンク数、最終アクセス時刻、更新時刻などを表示するコマンドである。


stat コマンドの基本的な使い方
Linux での stat コマンドの実行例を以下に示す。引数にファイル名やディレクトリ名を指定すると、そのファイルの詳細情報を表示する。
% stat sample.txt
  File: `sample.txt'
  Size: 3               Blocks: 8          IO Block: 4096   regular file
Device: fc03h/64515d    Inode: 4200774     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  600/  68user)   Gid: (  600/  68user)
Access: 2017-12-05 20:51:00.000000000 +0900
Modify: 2017-05-25 14:06:09.717293917 +0900
Change: 2017-05-25 14:40:35.339251735 +0900

上記サンプルは以下のような意味である。
File ファイル名
Size ファイルサイズ
Blocks ブロック数
IO Block ブロックサイズ
(項目名表記なし) ファイルの種類
Device [デバイス番号 16進数表記]h/[デバイス番号 10進数表記]d の形式。デバイス番号って何だ?
Inode iノード番号
Link リンク数。ln でハードリンクすると増えていく
Access パーミッション
Uid ユーザーID/ユーザ名
Gid グループID/グループ名
Access 最終アクセス時刻
Modify 最終更新時刻
Change 最終ステータス変更時刻

上記は通常ファイルに対して stat コマンドを実行した例であるが、ファイルの種類によっては、下記のように項目が増える場合がある。
シンボリックリンクに対して実行:
→ File: `/usr/tmp' -> `../var/tmp' となる。
/dev/null などのデバイスに対して実行:
→ Device type: 1,3 が増える。

下記のように、複数ファイルを指定することもできる。
% stat *.txt dir/*

stat コマンドのオプション
Linux で使用できる GNU coreutils に含まれる stat コマンドのオプションは以下のとおり。

-L または --dereference
シンボリックリンクをたどる。このオプションを付けない場合、シンボリックリンク自身の情報を表示する。
-f または --file-system
そのファイル自身ではなく、そのファイルが属するファイルシステムの情報を表示する。
% stat -f /home/68user/sample.txt
File: "/home/68user/sample.txt"
ID: 7a6477d135465b7c Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 25190501 Free: 20263789 Available: 18982497
Inodes: Total: 6414336 Free: 6264736
この環境ではファイルシステムは / であるため、/ の情報を表示していることになる。上記サンプルは以下のような意味である。
ID ファイルシステム ID
Namelen ファイル名の最大長
Type ファイルシステムの種類
Block size このファイルシステムのブロックサイズ
Fundamental block size よくわからないが、ブロックサイズが可変であるファイルシステムにおける、最低限必要なブロックサイズのことであろうか?
Blocks: Total このファイルシステム全体のブロック数
Blocks: Free このファイルシステム全体の未使用ブロック数
Blocks: Available このファイルシステム全体の利用可能ブロック数 (Total - Free)
Inodes: Total このファイルシステム全体の inode 数
Inodes: Free このファイルシステム全体の未使用 inode 数
-c [フォーマット文字列] または --format=[フォーマット文字列]
デフォルトの代わりに指定フォーマットで出力する。

ファイルサイズのみ表示する例:
% stat -c "%s" sample.txt
3
パーミッション・ファイルサイズ・ファイル名を表示する例:
% stat -c "%A %s %n" sample.txt
-rw-r--r-- 3 sample.txt
任意の文字列も混ぜ込んで表示できる。
% stat -c "permission: %A size: %s filename: %n" sample.txt
permission: -rw-r--r-- size: 3 filename: sample.txt
-c オプションで使用可能なフォーマット文字列は後述する。なお、"%" そのものを表示したい場合は "%%" とする。
--printf=[フォーマット文字列]
-c オプションでは "\n" などの改行コードには対応していないが、
--printf オプションでは "\n" や "\t" などが使える。勝手に改行はしてくれないので、最後に "\n" を付けるとよい。
% stat --printf="permission: %A\nsize: %s\nfilename: %n\n" sample.txt
permission: -rw-r--r--
size: 3
filename: sample.txt
--printf オプションで使用可能なフォーマット文字列は後述する。
-t または --terse
シンプルな形式で情報を表示する
% stat -t sample.txt
sample.txt 3 8 81a4 600 600 fc03 3674740 1 0 0 1495695645 1495695645 1495695645 4096

-c オプションや --printf オプションで使用可能な書式
GNU coreutils 版 stat コマンドの-c オプションや --printf オプションで使用可能な書式と実行例は以下のとおり。

パーミッション 8進数表記:
% stat -c "%a" sample.txt
644
上記はパーミッションが rw-r--r-- の例だが、もし --------- の場合、%a の表示は 0 となってしまう。この場合は 000 と表示したいだろうから、%a ではなく %03a とするとよい。
% chmod 000 sample.txt
% stat -c "%03a" sample.txt
000
パーミッションの人間が読める形式での表記:
% stat -c "%A" sample.txt
-rw-r--r--
割り当てられたブロック数:
% stat -c "%b" sample.txt
8
各ブロックの大きさ (バイト単位):
% stat -c "%B" sample.txt
512
SELinux のセキュリティコンテキスト文字列:
% stat -c "%C" sample.txt
stat: failed to get security context of `sample.txt': 利用可能なデータがありません
→ 当ページ管理人の環境では SELinux を無効化してあったので、上記のような表示となってしまった。
デバイス番号の 10進数表記:
% stat -c "%d" sample.txt
64515
デバイス番号の 16進数表記:
% stat -c "%D" sample.txt
fc03
raw モードの 16進数表記:
% stat -c "%f" sample.txt
81a4
ファイルの種類:
% stat -c "%F" sample.txt
regular file
所有者のグループID:
% stat -c "%g" sample.txt
600
所有者のグループ名:
% stat -c "%G" sample.txt
68user
リンク数:
% stat -c "%h" sample.txt
1
iノード番号:
% stat -c "%i" sample.txt
4200774
ls -li で表示される iノード番号と同じである。
マウントポイント:
% stat -c "%m" sample.txt
?
ファイル名:
% stat -c "%n" sample.txt
sample.txt
クォートされたファイル名:
% stat -c "%N" sample.txt
`sample.txt'
最適な I/O 転送サイズのヒント情報:
% stat -c "%o" sample.txt
4096
よくわからないが、"block sizes, alignment and I/O hints" でググると何か書いてある気がする。
合計サイズ (バイト単位):
% stat -c "%s" sample.txt
3
通常ファイルの場合は、ファイルサイズ。ディレクトリの場合は消費ブロックサイズ、シンボリックリンクの場合は、シンボリックリンクのリンク先のファイル名のサイズ。
メジャーデバイス番号 (16進数表記):
% stat -c "%t" sample.txt
0
マイナーデバイス番号 (16進数表記):
% stat -c "%T" sample.txt
0
所有者のユーザID:
% stat -c "%u" sample.txt
600
所有者のユーザ名:
% stat -c "%U" sample.txt
68user
最初に作成した日時 (人間が読みやすい形式):
% stat -c "%w" sample.txt
?
マニュアルには "不明な場合には -" と書いてあったが、当ページ管理人の CentOS 環境では "?" が表示された。birthtime のことであろう。2017年5月現在の Linux では使えない。
最初に作成した日時 (Epoch からの秒数):
% stat -c "%W" sample.txt
?
マニュアルには "不明な場合には 0" と書いてあったが、当ページ管理人の CentOS 環境では "?" が表示された。birthtime のことであろう。2017年5月現在の Linux では使えない。
最終アクセス日時 (人間が読みやすい形式" sample.txt:
% stat -c "%x" sample.txt
2017-12-05 20:51:00.000000000 +0900
最終アクセス日時 (Epoch からの秒数):
% stat -c "%X" sample.txt
1512474660
1970年1月1日 00:00:00 からの経過秒数。
最終更新日時 (人間が読みやすい形式):
% stat -c "%y" sample.txt
2017-05-25 14:06:09.717293917 +0900
最終更新日時 (Epoch からの秒数):
% stat -c "%Y" sample.txt
1495688769
1970年1月1日 00:00:00 からの経過秒数。
最終変更日時 (人間が読みやすい形式):
% stat -c "%z" sample.txt
2017-05-25 14:40:35.339251735 +0900
最終変更日時 (Epoch からの秒数):
% stat -c "%Z" sample.txt
1495690835
1970年1月1日 00:00:00 からの経過秒数。

stat コマンドの存在意義
上記の一部は ls コマンドなどでも表示することができるものの、例えばシェルスクリプトからタイムスタンプを取得した場合、
% ls -l
drwxr-xr-x 3 root wheel 512 Sep 29 2008 olddir
dr-xr-xr-x 1 root wheel 0 May 25 14:55 newdir
のように、月が Jan・Feb などの英略語表記であったり、最終更新日時が 1年以内は月・日・時・分、それより古いものは年・月・日表記になるなど、扱いづらい場合が多い。

そのために、加工されていない情報を取得するために stat コマンドが作成されたものと思われる。

UNIX/Linux での stat コマンドの歴史
stat コマンドは、NetBSD 1.6 (2002年リリース) で初登場し、その後 FreeBSD・OpenBSD でも使えるようになった。Linux においては、GNU coreutils に含まれているため、RedHat Linux・CentOS・Ubuntu 等、すべての Linux にて statコマンドを使うことができる (おそらく sh-utils に 2002〜2005年に追加され、その後 coreutils に統合されたのではないかと思うが、具体的な追加日時は調べきれなかった)。

BSD・Linux 以外の、Solaris や HP-UX 等には stat コマンドは存在しない (coreutils をインストールしない限り)。

ちなみに stat コマンドのようなファイルの情報を取得するためのシステムコール stat(2) は、ほとんどの UNIX/Linux に存在するはずである。

BSD での stat コマンドについて
FreeBSD 等の stat コマンドは、オプションなしの場合、1行表示を行う。
% stat sample.txt
1043 22327320 -rw-r--r-- 1 68user realuser 0 0 "May 25 14:36:18 2017" "May 25 14:36:18 2017" "May 25 14:36:18 2017" "May 25 14:36:18 2017" 16384 0 0 sample.txt
GNU coreutils の stat コマンドのような表記は、-x オプションを付ける。
% stat -x sample.txt
File: "sample.txt"
Size: 0 FileType: Regular File
Mode: (0644/-rw-r--r--) Uid: (10001/ 68user) Gid: ( 500/realuser)
Device: 4,19 Inode: 22327320 Links: 1
Access: Thu May 25 14:36:18 2017
Modify: Thu May 25 14:36:18 2017
Change: Thu May 25 14:36:18 2017

その他オプションも結構違うが、そのうち書く。

関連コマンド
>> FreeBSDオンラインマニュアル(man) FreeBSD stat(1)
>> Linuxオンラインマニュアル(man) Linux stat(2)
>> Linuxオンラインマニュアル(man) Linux stat(1)