目的
- MacOSX上に存在する全ての「~.java」ファイルをリストアップします。
- 上記の内「System.out.println」が含まれているファイルを見つけます。
環境
MacOS X 10.14.4 Mojave
使用コマンド
mdfind [探したいファイル名]
インデックス検索出来るmdfindコマンドを使うことでfindよりも高速に検索出来ます。
CentOSのようにMacOSXにもFreeBSD由来のlocateが有りますが、mdfindはファイル名インデクシングを自動で行ってくれる優位性があります。
mdfindは「コマンドキー」+「スペースキー」で起動する「SportLight」ツールのコマンドラインインタフェースです。mdimportコマンドやmdutilコマンドでインデックスの操作が出来ます。
ファイル名をインデクシングするlocateと違い、ファイルの内容もインデクシングします。(が、後者はおまけ程度に考えた方が安全です)
ファイル名検索
mdfindコマンドはファイル名だけでなくファイル内容にも引っかかります。この為、拡張子「java」のファイルをリストアップする為にはgrepで拡張子フィルタします。
$ mdfind .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検索はファイル内容にも引っかかる為以下で良いように思います。
$ mdfind System.out.println | grep -e "\.java$"
ですがmdfindのインデクシングはファイル内容に関しては正確性と即効性が不足していると思われ、上手く引っかかってくれません。
Linux同様、リストアップされた結果をxargsコマンドで一行ずつgrepに渡してやる方が確実です。
$ mdfind .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はファイルを作成した時点でファイル名はインデクシングされます。mdimportやmdutilでインデックス更新する必要は在りません。
まとめ
ファイル名で検索する分にはmdfindを覚えておけば苦労しません。