mac

各種OSでのインデックスを使用した高速ファイル名検索と全文検索【MacOSX編】

投稿日:2019年5月10日 更新日:

目的

  • 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を覚えておけば苦労しません。


-mac

執筆者:

関連記事

MacOSXにSSH接続

MacOSX Mojave(10.14.4) リンゴマークから「システム環境設定…」をクリック。 「リモートログイン」にチェック。 ssh ユーザ名@MacOSXのIP C:\Users\ …

開発中のWebシステム上でApple Pay決済を有効化する為のApple Developer Program設定 

WebシステムでApple Pay決済を有効にするにはApple側にその旨を認証して貰う必要が有ります。 前回、Web上でApple Payテスト課金をする為のサンドボックステスターを作成しました。 …

UserAgent判定JSライブラリ「UAParser.js」と「Platform.js」の比較

(私はUAParser.jsを使っています) ネットを探すとUA文字列を解析してブラウザ判定をするコードが一杯出てきます。 でもUA解析プログラムを自前で作ってシステムに組み込むとなると、新しいブラウ …

 

shingo.nakanishi
 

東京在勤、職歴2n年中年ITエンジニアです。まだ開発現場で頑張っています。

19歳(1996年)から書き始めたアウトプット用プライベートWeb日記数が5,000日を超え、残りの人生は発信をして行きたいと思い、令和元日からこのサイトを開始しました。勉強と試行錯誤をしながら、自分が経験したIT関連情報を投稿しています。

私と同じく、今後IT業界で生計を立てて行きたいと考えている方や、技術共有したいけど仲間が居なくて孤独、といった方と一緒に成長、知識共有して行けたら楽しいな、と思っています。