stat でファイル情報を確認する
ls -l で足りるはずが、足りない
ls -l は所有者と権限とサイズと更新日時を、詰めて 1 行に出してくれます。ただし出るのはそこまでです。最後に読まれたのはいつか、実体がディスク上のどの管理番号に結びついているか、といったことは分かりません。
stat は 1 つのファイルについて、持っている情報を全部並べます。
ターミナル
$ stat /etc/hosts
File: /etc/hosts
Size: 221 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 262146 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-08-20 09:15:02
Modify: 2026-08-19 22:40:11
Change: 2026-08-19 22:40:11ファイルの中身と、その中身についての情報は別の場所に置かれています。後者をメタデータと呼び、stat が読み出しているのはこちらです。
下に並んでいる 3 つの時刻は別のものです。Modify は中身が書き換わった時刻、Change は権限や所有者を含むメタデータが変わった時刻、Access は読まれた時刻です。中身を触っていないのに Change だけ新しいときは、誰かが権限を変えたということになります。
欲しい値だけ取り出したい
上の表示は人が読むためのものです。スクリプトの中で使うには飾りが多すぎます。-c に書式を渡すと、指定した値だけが出ます。
ターミナル
$ stat -c '%A %U' /etc/hosts
-rw-r--r-- root% で始まるのが指定子で、%A が権限の文字列表現、%U が所有者です。書式のうち指定子ではない部分はそのまま出力されるので、区切りや見出しを混ぜられます。使える指定子は man stat の FORMAT の節に並んでいます。
何秒前に更新されたのかを知りたい
%y は人が読む形の更新日時ですが、そのままでは引き算ができません。%Y を使うと、1970 年からの通算秒という数値で出ます。
ターミナル
$ stat -c '%Y' /etc/hosts
1755610811いまの時刻も date +%s で同じ形の数値になるので、引けば経過した秒数が出ます。
ターミナル
$ echo $(( $(date +%s) - $(stat -c '%Y' /etc/hosts) ))
541200「更新から 1 時間以上経っていたら知らせる」といった判断が、これで書けるようになります。
statの書式指定は macOS では通りません。macOS のものは BSD 由来で、同じことをするのに別の指定子を使います。Linux 向けに書いたスクリプトを手元の Mac で試すと、ここで止まります。
課題
- stat -c の書式指定を使う
- ファイルサイズと名前を 1 行で出す