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\ …

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

2019年時点で開発が継続しているUA判定JSライブラリから2つ選択して動作を確認しました。 目次1 Webリソースから比較1.1 github比較1.2 NPMリポジトリ比較2 実際に使用して比較2 …

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

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

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯技術者として楽しく生きることを目指しています。デスマに負けず健康第一。