目的
- MacOSX上に存在する全ての「~.java」ファイルをリストアップします。
- 上記の内「System.out.println」が含まれているファイルを見つけます。
環境
MacOS X 10.14.4 Mojave
使用コマンドその1:locate
MacにもLinuxと同じくlocateコマンドがあります。MacOSはFreeBSDベースである為、BSDのlocateコマンドと使い方は同じです。
// インデックスを作成
$ sudo /usr/libexec/locate.updatedb
// ファイル名検索
$ locate Hoge.java
ただ、Linuxのupdatedbと違い、インデックスを一から作成し直す為時間がかかり、少々使い勝手が悪いです。またマルチバイトを含むパスはインデックスしてくれません。Macではlocateよりも次のmdfindを使った方が便利です。
使用コマンドその2:mdfind
mdfindは「コマンドキー」+「スペースキー」で起動する「SpotLight」ツールのコマンドラインインタフェースです。mdimportコマンドやmdutilコマンドでインデックスの操作が出来ます。
ファイル名のみをインデクシングするlocateと違い、ファイルの内容もインデクシングする為、全文検索もこのコマンド一つで完結します。
ファイル名検索
mdfindコマンドは-nameオプションを付けることでファイル名検索になります。正規表現を使うオプションは無い為、拡張子が.javaのファイルに絞るにはgrepを併用します。
$ mdfind -name .java | grep -e "\.java$"
/Users/~/source/r/release/com/google/android/gms/safetynet/R.java
/Users/~/source/r/release/android/arch/core/R.java
/Users/~/source/r/release/android/support/v4/R.java
/Users/~/source/r/release/com/google/android/gms/clearcut/R.java
/Users/~/source/r/release/com/google/android/gms/ads/R.java
:
(snip)
OS内の全ての~.javaファイルパスがリストアップされました。
全文検索
mdfindが使用するインデックスにはファイル内容もインデクシングされています。-nameを外せば全文検索になります。
// ファイル内容に「System.out.println」を含む全ファイルから.javaのみ抽出
$ mdfind System.out.println | grep -e "\.java$"
/Users/~/Hoge3.java
/Users/~/workspace/snippet/src/snippet/Hoge.java
/Users/~/Hoge2.java
もしくはLinux同様、リストアップされた結果をxargsコマンドで一行ずつgrepに渡してやる方法。
昔、ファイルに書いたはずの内容がインデクシングされず、引っかからないことがありました。「なんかインデックスおかしいな」という時はこっちの方が確実だったりするかも知れません。
$ mdfind -name .java | grep -e "\.java$" | xargs grep System.out.println
/Users/~/Hoge3.java: System.out.println();
/Users/~/workspace/snippet/src/snippet/Hoge.java: System.out.println("hoge");
/Users/~/Hoge2.java: System.out.println()
:
(snip)
全~.javaの中から「System.out.println」文字列を含むjavaファイルがリストアップされました。
インデックス更新
MacOSXではmdworkerプロセスがファイル作成を監視しており、作成した時点でインデクシングされます。通常利用の範囲であればmdimportやmdutilでインデックス更新する必要は在りません。
もし検索結果が期待しないものであれば以下で強制的にインデックスを作成しなおします。
$ sudo mdutil -E /
まとめ
ファイル名で検索する分にはmdfindを覚えておけば苦労しません。