コース一覧
Linuxテキストツール
stat でファイル情報を確認する

Linuxテキストツール

パイプ、正規表現、grep、sed、awk、find、圧縮を学び、テキストとファイルをコマンドで効率的に検索・加工できるようにします。

1
テキスト処理とパイプ活用
01. パイプとリダイレクト5分
02. 文字列検索 grep5分
03. 正規表現入門5分
04. grep 応用:正規表現5分
05. テキスト加工 sed5分
06. 列処理 awk5分
07. パイプ活用:実践的なコマンド連携5分
08. テキスト処理チェック5分
2
ファイル検索と圧縮・解凍
01. find でファイルを検索する5分
02. ワイルドカードとグロブパターン5分
03. ファイルの圧縮と解凍5分
04. stat でファイル情報を確認する5分
05. ファイル管理チェック5分

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 で試すと、ここで止まります。

課題

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

ヒント

printf 'hello world' は改行を入れないので 11 バイトちょうど

stat -c '%s %n' でサイズとファイル名を取り出せる

出力末尾の改行はそのままで OK (loose_equal が trim する)

script.sh
script.sh
エディタを読み込んでいます
ターミナル出力