stat で日付をゲット – ステイタスコマンド

Macのターミナルで使うステイタスゲットコマンド stat について。

ステイタス、ファイル属性を取得できる stat です。日付やサイズなど、ファイルの情報が得られます。

stat パス

こう書くと属性の情報が得られます。

16777235 12930932937 -rw-r--r-- 1 UserName staff 0 69970417 "Jul 28 13:20:16 2021" "Jul 28 13:20:10 2021" "Jul 28 13:20:10 2021" "Jul 28 13:01:40 2021" 4096 165400 0 /Users/UserName/folder/folder/FMDate.afphoto

このような結果が返ってきますね。いろんな暗号に交ざって、4つの日付が見えます。最初に出てくるのが最後のアクセス日付、2番目が変更日付、3番目が最後のステータス変更日付、4番目がファイル作成日付です。

リストを返す ls コマンドでも日付を得られますが、作成日と変更日を両方得ることが出来ません。というか得る方法を知りません。

ls のほうがリスト化するには便利ですが、こと日付に関しては 一気に4つの日付がゲットできて最強です。

というわけで stat で日付を得ましょうのコーナーでした。

で、終わってはいけません。

このコマンドのオプションについて検索して調べて、見様見真似でテストすると無残な結果になります。stat コマンドは同じでも、OSの違いでオプションが微妙に異なります。ネット検索して見つかる情報はほとんどがLinuxの情報で、Macでは役に立ちません。

ターミナルで stat のヘルプを見ると説明が出てきますが、何語で喋っとんねんという意味不明の記述で溢れています。とても人間が理解出来る言語ではありません。仕方ないのでがんばって解釈していくつかは解明しました。

オプションについて

-f

出力フォーマットを細かく指定するオプションは -f です。他の環境と大きく異なる部分ですね。

-f 以外にもオプションはいろいろありますが、どれを試しても何故か出力から作成日が消えてしまい、役に立たなかったので放置します。

フォーマットの書き方というかテンプレは % で始まる暗号です。いくつか挙げてみます。

%N

ファイルネームという説明ですが、ファイル名というか、パスが得られました。フォルダの終わりに「 / 」が付かない形で出力され、ファイルかフォルダかを判読しにくいです。

%T

Typeという説明ですが、パスがフォルダかそうでないかという意味でのTypeです。つまり、対象がフォルダの場合、「 / 」が出力されます。%Nと組み合わせて
「%N%T」と書くことでフォルダの場合末尾がスラッシュで終わる形になります。

%z

対象のサイズがバイト単位で得られます。

%B

対象パスの作成日が得られます。UNIXタイムスタンプであり、ただの数字です。見やすい形に成形するには S をくっつけて「%SB」にします。

%m

対象パスの変更日が得られます。UNIXタイムスタンプであり、ただの数字です。見やすい形に成形するには S をくっつけて「%Sm」にします。

%a

対象パスの最後のアクセス日が得られます。UNIXタイムスタンプであり、ただの数字です。見やすい形に成形するには S をくっつけて「%Sa」にします。

%c

inodeとやらが変更された日時だそうです。UNIXタイムスタンプであり、ただの数字です。見やすい形に成形するには S をくっつけて「%Sc」にします。

例えばこんなふうに書きます。

stat -f "filePath:%N  type:%T size:%z created:%SB modified:%Sm" パス

次のような結果が返されました。

filePath:/Users/●●/●●/●●/FM-Date.afphoto  type: size:69970417 created:Jul 28 13:01:40 2021 modified:Jul 28 13:20:10 2021

最初、Typeを勘違いしていて、何も出力されないのは何故?と思ってましたが、Typeはフォルダの場合にのみスラッシュを返すようです。それをtypeと呼ぶのか・・・

例ではスペースですが、セパレータを工夫することで後の加工が楽になります。後の工夫というのは、出力結果から日付だけ抽出したりといった細工です。

timefmt

S はいいんですが「Jul 28 13:01:40 2021」この書式はちょっと厄介です。後の加工も大変。 -t timefmt というオプションも説明書に記述されているのですが、何を言ってるのかよくわかんないのでした。

UNIX タイムスタンプ

変な書式にするくらいなら %B とだけ指定して数字のみをもらったほうが後の加工は楽になります。UNIXタイムスタンプの数字を読みやすくする方法はいろいろありますから。

フォルダの場合

フォルダ以下のファイル群の情報が欲しい場合、パス/* と、最後のスラッシュの後ろにワイルドカードの * 印を入れます。フォルダ名だけだと、そのフォルダの情報が出力されます。

フォルダの中身全部ですから、フォルダの中のフォルダもリストされます。でも%Tを付けておくと最後にスラッシュが付くので判別できますね。

ls ではサブフォルダの指定などいろんな出力ができますが stat はそこが弱いようで、細かな指定方法を知らない人にとってはリストの作成が厄介です。lsと同じオプションがもっとあればいいのに。

コマンドに長けている人なら、先にリストを作って stat に渡してループで処理するとか、そういうことが出来ると思うのですが、そんなことができればいいなあ。

実際の利用

実際に利用する際には出力をクリップボードに収めてコピペで運用しています。最後に「 | 」を付け足して pbcopy を連結させます。この pbcopy コマンドもMac専用なんですってね。他の環境では異なるコマンドのようです。

stat -f "%N%T+++%B+++%m" パス/* | pbcopy

後の加工を前提にこんなふうに書くとコピペ運用や検索置換も楽勝で作成日と変更日をゲットできます。