MacのTerminalで高速に全文検索をする

MacにはSpotlightというインデックス式の高速検索ツールがあります。

これを利用すると全文検索が可能です。

TerminalからSpotlightの機能を使うには、mdfindコマンドを利用します。

mdfind "hogehoge"

フォルダを指定するには、-onlyinオプションをつけます。

mdfind -onlyin . "hogehoge"

ここまでの方法だと、ファイル名とファイル内容両方が検索対象になってしまうので、ファイル内容だけを検索対象にしたい場合は以下のようにします。

mdfind -onlyin . "kMDItemTextContent=='*hogehoge*'"

さらにファイル名に条件を加えたい場合には、以下のように条件を加える事もできます。

mdfind -onlyin . "kMDItemTextContent=='*hogehoge*' && kMDItemDisplayName == '*.xml'"

さらに細かい検索式を見たい場合にはAppleの公式ドキュメントを利用します。

https://developer.apple.com/library/mac/documentation/Carbon/Conceptual/SpotlightQuery/Concepts/QueryFormat.html#//apple_ref/doc/uid/TP40001849

動作のちょっとした改善

Spotlightだけだとファイルのどこにヒットしたのかが不明なので、これを知りたい場合にはgrepを組み合わせます。

mdfind -onlyin . "kMDItemTextContent=='*hogehoge*'" | xargs grep "hogehoge"

findを利用した場合とほぼ同等の結果が得られますが、こちらを利用した場合のほうが細かく、また高速に検索をすることができます。

(検索条件を二重に書くところはちょっとぎこちない気もします)

参考