Macのmdfindを活用する
Macでファイルにタグを付けるでも書いたが、Macのファイルにはいろいろメタデータが付いていて、それを使って高速に検索できる。これはGUIのSpotlightで使われているが、コマンドでもできる。
ファイルのメタデータを表示するコマンドは mdls、検索するコマンドは mdfind である。
例:2019年6月16日の写真(必ずしも写真ライブラリに入っていない)を探したい。とりあえず写真という条件は省いて、Linuxなら
find / -type f -newermt 2019-06-16 ! -newermt 2019-06-17
でできる。ただし、ファイルシステム全体を検索するのは時間がかかる。mdfindを使うなら
mdfind 'kMDItemFSCreationDate < $time.iso(2019-06-17) && kMDItemFSCreationDate >= $time.iso(2019-06-16)'
でできる。こっちのほうが高速である。ただし、時間はUTCになるので、少し過去に向かって広めにするほうがよいかもしれない:
mdfind 'kMDItemFSCreationDate < $time.iso(2019-06-17) && kMDItemFSCreationDate > $time.iso(2019-06-15)'
写真(RAWフォーマットの CR2 も含める)だけを表示するには、メタデータの検索式を書くよりも、これらのコマンドの最後に | egrep -i '\.(jpg|jpeg|cr2|heic)$' を付けるほうが簡単そうだ。
メタデータには、ファイルの中身やタイムスタンプから設定されるものと、自由に設定できるものがある。上で使った kMDItemFSCreationDate はタイムスタンプから決まる。自由に設定して特に便利なのはFinderコメント kMDItemFinderComment で、これはFinderの「情報を見る」の「コメント」で編集できる。コマンドで編集するには、以前はこのページで osxmetadata というPythonパッケージ兼コマンドラインツールを紹介していたが、Mac固有のosascriptを呼び出す簡単なシェルスクリプトを使うほうが確実なので、続編 MacのFinderコメントを活用する にやり方を詳しく書いた。
具体例としてPDFのタイトルを検索することを考えよう。PDFにタイトルなどメタ情報が設定されていれば、それらはファイル先頭近くにテキストで書かれており、Popplerの pdfinfo コマンドやExiftoolなどで表示できる。Macではこのメタデータを拾って kMDItemTitle メタデータとして設定されているはずである。設定されていれば
mdls -name kMDItemTitle filename
とすれば kMDItemTitle = "タイトル" の形で表示される。あるいは
mdls -raw -name kMDItemTitle filename
とすればタイトルだけ出力される(最後に改行もつかない)。
もし kMDItemTitle がないか、あってもさらに補足の情報を追加したければ、上述のFinderコメントを使うことになる(続編 MacのFinderコメントを活用する 参照)。これら2つの情報を表示するには
mdls -name kMDItemTitle -name kMDItemFinderComment filename
とすればよい。-raw も付ければ2つの情報を \0 で結合したものが出力される。表示順はFinderコメントが先になる。
検索は続編でも書いたが、簡単には例えば
mdfind "kMDItemFinderComment == 'attention is*'cd"
のようにすればよい(最後の cd は大文字小文字を区別せず文字装飾を無視する意)。
このように設定したメタデータはrsyncで別Macに送れる。そのためのオプションは、Mac付属の /usr/bin/rsync では --extended-attributes、本家(Homebrewで入るもの)では --xattrs (-X) である。Homebrewで入る新しいrsyncはzlib圧縮に加えてzstd圧縮などができる(zstdがデフォルト)。
参考