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と組み合わせて |
%z |
対象のサイズがバイト単位で得られます。 |
%B |
対象パスの作成日が得られます。UNIXタイムスタンプであり、ただの数字です。見やすい形に成形するには S をくっつけて「%SB」にします。 |
%m |
対象パスの変更日が得られます。UNIXタイムスタンプであり、ただの数字です。見やすい形に成形するには S をくっつけて「%Sm」にします。 |
%a |
対象パスの最後のアクセス日が得られます。UNIXタイムスタンプであり、ただの数字です。見やすい形に成形するには S をくっつけて「%Sa」にします。 |
%c |
inodeとやらが変更された日時だそうです。UNIXタイムスタンプであり、ただの数字です。見やすい形に成形するには S をくっつけて「%Sc」にします。 |
例えばこんなふうに書きます。
stat -f "%N type:%T size:%z created:%SB modified:%Sm" パス
次のような結果が返されました。
/Users/●●/●●/●●/FM-Date.afphoto type: size:69970417 created:Jul 28 13:01:40 2021 modified:Jul 28 13:20:10 2021
例ではセパレータがスペースですが、これを工夫することで後の加工が楽になります。例えば「, 」にするとか、「+++」みたいな素っ頓狂なセパレータにするとか。後の工夫というのは、出力結果から日付だけ抽出したりといった細工です。
timefmt
日付を整える S ですが「Jul 28 13:01:40 2021」この書式はちょっと厄介です。後の加工も大変。 -t timefmt というオプションも説明書に記述されているのですが、何を言ってるのかよくわかんないのでした。
UNIX タイムスタンプ
変な書式にするくらいなら %B とだけ指定して数字のみをもらったほうが後の加工は楽になります。UNIXタイムスタンプの数字を読みやすくする方法はいろいろありますから。
フォルダの場合
フォルダ以下のファイル群の情報が欲しい場合、パス/* と、最後のスラッシュの後ろにワイルドカードの * 印を入れます。フォルダ名だけだと、そのフォルダの情報が出力されます。
フォルダの中身全部ですから、フォルダの中のフォルダもリストされます。でも%Tを付けておくと最後にスラッシュが付くので判別できますね。
ls ではサブフォルダの指定などいろんな出力ができますが stat はそこが弱いようで、細かな指定方法を知らない人にとってはリストの作成が厄介です。lsと同じオプションがもっとあればいいのに。
コマンドに長けている人なら、先にリストを作って stat に渡してループで処理するとか、そういうことが出来ると思うのですが、そんなことができればいいなあ。
find と併用
ls よりも「/*」よりも、find と組み合わせるのが良い案配だと気づきました。-exec というオプションを使って、結果を次のコマンドに引き継げるんです。この使い方が自分にとっては最良かなと。
結果をクリップボードに
実際に利用する際には出力をクリップボードに収めてコピペで運用しています。最後に「 | 」を付け足して pbcopy を連結させます。この pbcopy コマンドもMac専用なんですってね。他の環境では異なるコマンドのようです。
stat -f "%N%T+++%B+++%m" パス/* | pbcopy
後の加工を前提にこんなふうに書くとコピペ運用や検索置換も楽勝で作成日と変更日をゲットできます。
※ ずっと知らなかったのですが、stat は Xcode に含まれるコマンドらしく、Xcode をインストールしていないと使えないのだとか。インストールしておきましょう。