2014年最初の今回は「mdfind」について。知る人ぞ知るSpotlightを利用したファイル検索用コマンドだが、他のコマンドと組み合わせて実行すると、GUIのSpotlightでは難しい検索が可能になる。これまで度々当コラムで紹介しているものの、体系的に紹介していないことに気付き、いまさらながら取りあげようという算段だ。
OS Xにおける「Spotlight」
OS X Tigerのとき登場したSpotlightは、「デスクトップ検索機能」などという言葉で紹介されることが多い。それ自体は正しいが、木を見て森を見ずの喩えもあるように、全体像を見誤る可能性がある。なぜなら、メニューバー右端やショートカットキーから呼び出すSpotlightフィールドは「Spotlightという検索システムの外側(フロントエンド)」であり、その核心部分は他に存在するからだ。
Spotlightの核心部分とは、OS Xがブートする過程で起動されるインデックス作成サービス「mds」と、必要に応じて自動実行されるメタデータ収集プログラム「mdworker」だ。他にもSpotlight関連の常駐プロセスはいくつか存在するが、この2つのプロセスなしにSpotlightは機能しない。
言ってしまえば、Spotlightフィールド自体に検索エンジンとしての機能はなく、それらプロセスが収集/整理したメタデータデータベースをもとに検索結果を返すに窓口に過ぎない。Finderの検索フィールドでも同じ機能を利用できるのは、FinderがSpotlightのフロントエンドを兼ねているからだ。
今回取りあげる「mdfind」もまた、Spotlightのフロントエンドだ。Terminalからコマンドとして実行するCUIツールだが、検索窓口としての機能そのものはGUIのSpotlightフィールドと変わらない。その一方、他のコマンドとパイプなどの機能を利用して連携させることができるので、GUIでは難しい使い方も可能になる。取り付きにくさはあるかもしれないが、使い方次第ではGUI以上の機能を発揮するのだ。
mdfindの使いかた
mdfindの基本形は、「mdfind オプション 検索語」だ。オプションは省略可能なため、コマンド名に続け(当然スペースを1つ空けて)検索語だけを指定するだけで、GUIのSpotlightフィールドと同等の機能を発揮する。ファイル/フォルダ名の一部やファイルに含まれる文字列を検索語にすれば、該当するファイルがフルパスで一覧表示されるはずだ。
$ mdfind 検索語
それでは情報が多すぎて役立たないので、ひとひねり加えたい。「-onlyin」オプションを使えば範囲を特定できるので、ホームフォルダに絞って検索してみよう。書き方はかんたん、「-onlyin ~」(シェルではホームフォルダを「~」の1文字で表現できる)とすればOKだ。パスは相対指定できるので、書類フォルダは「~/Documents」、ピクチャフォルダは「~/Pictures」といった要領で記述すればいい。そうすれば、内容の多様性ゆえにいろいろなキーワードでヒットしてしまうメール(*.emlx)に悩まされずにすむ。
$ mdfind -onlyin ~/Documents
特定の領域を"監視"することも可能だ。「-live」オプションを指定すれば、「-onlyin」で指定したフォルダを検索したあとも処理を続行、変化が現れたとき(検索条件に一致するファイルが増減した場合)一致するファイル数を表示してくれる。処理を中断する場合はControl-Cを押せばいい。
$ mdfind -live -onlyin ~/Documents
この機能を応用すると、写真(JPEGファイル)がフォトストリームに追加され次第情報を表示することが可能だ。フォトストリームを有効にしたMacでは、バックグラウンドに「PhotoStreamAgent」というプロセスが常駐し、フォトストリームに画像ファイルが追加され次第ダウンロードする役割を果たす(参考記事。そのキャッシュ領域をmdfindで監視すれば、iPhotoやApertureを起動したままにしなくても、フォトストリームに写真が追加されたことがわかるというわけだ。iCloudのローカル領域(~/Library/Mobile\ Documents/)でも同様の"監視"を行えば、意外に便利な活用法を発見できるかもしれない。
$ mdfind -live -onlyin ~/Library/Application\ Support/iLifeAssetManagement/ .JPG