mdfind – macOSのCLIでもSpotlightを使ってファイルを高速全文検索する

Mac (macOS) をお使いのみなさん、Spotlight って使ってますか?

Spotlight は macOS が標準的に持つ検索機能で、普通は右上の虫眼鏡のアイコンや、control+spacecommand+space1 のショートカットで検索ダイアログを表示させて使いますが、実はターミナル(コマンドライン)からも使えます。

さっそく使ってみる

macOS には、mdfind というコマンドが用意されています。

$ mdfind -h

Usage: mdfind [-live] [-count] [-onlyin directory] [-name fileName | -s smartFolderName | query]
list the files matching the query
query can be an expression or a sequence of words
 :

man mdfindとすることで manpage も見ることが出来るのですが、どうも記述が古いままのようなので、オプションなどを確認する際は -h をご参照ください。

mdfind は Spotlight の検索メタデータを使って検索しますので、例えば findgrep -R 等で全ファイルを総ざらいすることと比べて、

  • 速い
  • ファイル名だけでなく中身を見て検索してくれる
  • OSと統合されている(追加で導入する手間がない)

といった特徴があるかと思います。

一方で、本家 find ほどの細かなオプションがあるわけではないし、grep -R の「全てのファイルを見て回った」という安心感が得られないのはデメリットかも知れません。検索対象が(Sppotlight の仕様により)ローカルディスクに限られてしまう、というのも制限の一つですね。

さて、具体的な使い方をみてみましょう。

例1 : 「秋葉原」という文字列が含まれるファイルを検索する

特にオプションを指定しなければ、全体(Spotlight がカバーする領域)が対象となります。

$ mdfind 秋葉原

mdfind_1

スクリーンショットを見てもらえばわかるとおり、PDFやExcelファイルも検索対象になっています。

ちなみにこちらのコマンド、手元の環境で time で実測してみたところ、実行時間は 0.2秒以下でした。

例2 : ホームフォルダの下にある、ファイル名に「.md」を含むファイルを検索する

上に転載した help にもあるように、mdfind にはいくつかオプションがあります。

$ mdfind -onlyin ~/ -name ".md"
  • -onlyin ... 特定ディレクトリ(フォルダ)の下だけを検索対象にする
  • -name ... 指定した文字列がファイル名に含まれるものだけを対象にする

ただし -name を指定すると、全文検索ではなくなってしまうので注意が必要です。

例3 : カレントディレクトリ以下にある、キーワード「RDS」を含む拡張子「TXT」のファイルを検索する

当たり前ですが標準入出力が使えるので、パイプで他のコマンドに出力を渡すといったことが可能です。

例えば全文検索とファイル名検索を両方やりたければ、ファイル名を grep してしまえばよいわけです。

$ mdfind -onlyin . "rds" | grep ".txt$" | xargs -n1 grep -i -H -C1 rds

例4 : 書類フォルダの中にある、「秋葉原」という文字列を含むファイルを全て開く

Finder 上からは「書類」と日本語になっているかも知れませんが、実体は「Documents」という名前のフォルダになりますので、コマンドラインはこのようになります。

$ mdfind -onlyin ~/Documents/ -0 秋葉原 | xargs -0 open

-0 を指定すると、mdfind は結果をNULL文字区切りで出力します。ヘルプにもあるように xargs に渡すときに使うと良いでしょう。特に、フォルダ名やファイル名に半角スペースが含まれる場合などに有効です。

open コマンドも macOS で使用可能なコマンドで、Finder からダブルクリックすることと同じ動作、つまり「デフォルトのアプリで開く」という動作をしてくれます。

ただし実際にこれをやると、大量にウィンドウが開いてしまって大変なことになるかもしれませんので… 試される場合は、ある程度結果が予測できるようにしてから行われることをオススメします。

ちなみに : Spotlight って?

解説し出すと長くなるので、Apple の公式と Wikipedia のリンクを貼っておきます。

GUI の Spotlight は起動も手軽ですし、単に書類を検索するだけでなく、アプリの起動にも、辞書を引くにも、数式計算にも使えます。

ファイルだけでなく、例えばメールや Evernote のノートなど、アプリが管理しているファイルを検索することも可能です。そのままブラウザに検索キーワードを渡す(command+B)こともできますし、使い慣れると非常に便利な機能です。

じゃあそれがターミナルでどう便利になるかというと、スクリプトや自動実行に組み込みやすくなるというのが一番でしょう。ディスクの中のどこかにある、特定の拡張子や文字列を含むファイルを定期的に削除する、といった目的では大活躍します2

また、GUIから検索した場合は見つかったファイルのフルパスを取得するのが少々手間なので、ターミナルから検索した方が便利な場合もありますね。

macOS を使われる上で、ひとつの「道具」として頭の片隅にでも置いておいて頂けますと幸いです。


  1. https://support.apple.com/kb/PH21907?locale=ja_JP&viewlocale=ja_JP 以前は control + space がデフォルトのショートカットでしたが、いつの頃からか変更されたようです 
  2. 実際、あるエディタが作りまくるバックアップファイルを探して削除するスクリプトを組んで愛用していました