mac ファイル検索が届かない場所|Spotlightの範囲と使い分け
先週さわったはずのファイルが出てこない。Spotlightに名前を打っても候補に上がらず、ファインダの窓で検索し直すと別の結果が並び、最後にターミナルで find を打ってようやく見つかる。mac ファイル検索という言葉で調べ始めるのは、たいていこの順番をひととおり試した後です。必要なのはショートカットの一覧ではなく、Macに載っている3つの検索が「それぞれどこまでを見ているのか」という地図です。この記事では、その範囲の違いと、見つからないときに何から確かめるかを順に整理します。
同じに見えて別物の2つの検索
最初に切り分けるべきは、見た目がほとんど同じ2つの検索です。Command+スペースで開くSpotlightと、ファインダの窓でCommand+Fを押して始める検索は、同じ索引を使っていますが、返してくるものが違います。Appleはこの差を次のように説明しています。
Spotlightで検索を開始すると、検索結果には、メール、カレンダーの予定、およびその他のアプリからの情報を含められます。Finderウインドウで検索を開始すると、内部ディスク上のファイルとフォルダだけが検索結果に含められます。 出典: support.apple.com
この1文で、検索結果がちぐはぐに見える理由のかなりの部分が説明できます。Spotlightはアプリの起動と回答を兼ねた入口で、ファイルはその中の一部として並びます。上位候補、アプリ、連絡先、メール、計算結果、Webの候補が混ざるため、目当てのファイルは下のほうに数件だけ表示されます。対してファインダの検索は、範囲と条件を指定して結果を並べ替えたり保存したりできる、ファイル専用の問い合わせです。
つまり2つは失敗の仕方が違います。Spotlightは、正しい結果が他の候補に埋もれて見えなくなる形で失敗します。ファインダの検索は、探す範囲がずれていて最初から対象に入っていない形で失敗します。2つの失敗を同じ「見つからない」として扱うと、原因にたどり着けません。
ファイルが本当に無いのかを確かめたいときは、Spotlightで判断しないことです。範囲を指定できるファインダの検索か、シェルのコマンドで確かめる。Spotlightは「あると分かっているものへ素早く行く」ための道具として使い分けます。
索引が届かない4つの場所
Spotlightもファインダの検索も、結果はすべてメタデータの索引から出ています。索引はファイル形式ごとの取り込みプラグインが作っていて、名前、日付、種類、対応形式なら本文のテキストまでを記録します。逆に言えば、取り込みプラグインが一度も見ていないものは、どんな言葉で検索しても出てきません。
見つからない原因は、次の4つでほぼ説明がつきます。
- 検索のプライバシーに登録されている。アップルメニューからシステム設定を開き、サイドバーのSpotlightにある「検索のプライバシー」に入っているフォルダやディスクは、結果から完全に外れる
- フォルダ名が .noindex で終わっている。この接尾辞が付いたフォルダは索引の対象外になる。付いたフォルダを複製すると、複製先にも引き継がれる
- アーカイブの中にある。zipファイルやディスクイメージの中のファイルは、開くまで検索に出てこない
- ボリュームの索引作成が止まっている。外付けディスク、ネットワーク共有、取り出し途中で索引が壊れたディスクは、見た目には分からないまま対象外になっている
Appleのサポートページも、アーカイブについては明確に書いています。ディスクイメージやzipファイルの中を探すときは、まずアーカイブを開いてから検索し直す必要があります。索引の側に「圧縮された中身まで読む」機能が用意されていないためです。
5つ目として、隠しファイルの扱いがあります。ドットで始まるディレクトリや、システムが使うファイルは通常の検索結果に並びません。ホームフォルダの直下にある設定ファイルが、シェルからは丸見えなのにファインダの検索では影も形もない、という状態はこれが理由です。
外付けディスクが対象になっているかどうかは、ターミナルで mdutil -s /Volumes/ディスク名 と打てば分かります。「Indexing disabled」と返ってきたら、そこから先を探しても意味がありません。ファイルが消えたと判断する前に、この1行を確かめる価値があります。
ファインダの検索を使い物にする3つの設定
ファインダの検索は、初期設定のままだと期待した動きになりません。変えるべき箇所は3つで、どれも一度きりの操作です。
検索の開始位置
ファインダの窓で検索欄に文字を打つと、標準では範囲が「このMac」に切り替わり、いま開いていたフォルダは捨てられます。ファインダメニューの「設定」から詳細タブを開き、「検索実行時」を「現在のフォルダ内を検索」に変えると、開いていたフォルダがそのまま範囲になります。フォルダを開いた状態で検索を始めた以上、たいていはそれが意図した動きです。
名前で探すか、中身で探すか
文字を打っている途中に出る候補の一覧には、ファイル名で一致させる選択肢が含まれます。ここを選ぶかどうかで、invoice-draft.md という1件を出すのか、本文のどこかに請求という語を含む40件を出すのかが変わります。中身の検索は強力ですが、結果を読むのに時間がかかります。多くの場面で必要なのは名前の一致のほうです。
条件行の追加
検索欄の右にあるプラスボタンで、種類、更新日、サイズといった条件を足せます。「その他」を選ぶと、ファイルの可視性やシステムファイルの扱いまで指定できます。隠しファイルをファインダの検索結果に出したいときは、この条件を追加する以外に方法がありません。組み立てた条件は、ファイルメニューの「新規スマートフォルダ」で保存でき、次回からは1クリックで同じ検索を呼び出せます。
検索語そのもので絞る
条件行を触らなくても、打ち込む文字列の側で絞れる部分があります。Appleが明記しているのは引用符の扱いです。語句を引用符で囲むとその並びどおりに一致し、囲まない場合は同じ語を任意の順番で含む項目まで結果に入ります。空白を含むファイル名の一部を探すとき、囲むかどうかで結果が数件と数百件に分かれます。
kind: と date: の指定はSpotlightでもファインダの検索でも使えます。kind:pdf と打てば種類を1つに絞れますし、date:yesterday なら更新日で絞れます。これらは組み合わせて効くのが利点で、引用符で囲んだ語句と種類と日付を並べれば、プラスボタンに手を伸ばさなくても、その場で読める件数まで落とせます。
この3つに、通常の窓で隠しファイルを表示するCommand+Shift+ピリオドを足せば、「ファインダの検索がおかしい」と感じる場面の大半は消えます。
コマンドで探すときの3つの流儀
ターミナル側の検索には性質の違う3つの系統があり、これを同じものとして扱うと結果を読み違えます。
mdfind は、Spotlightと同じ索引にシェルから問い合わせるコマンドです。応答は一瞬で、メタデータの属性もそのまま使えますが、前の章で挙げた死角をそっくり引き継ぎます。mdfind -onlyin . "見積" のように範囲を絞り、mdfind -name report で名前に限定できます。あるファイルが索引に入っているかを確かめたいときは、mdls ファイル名 で保持されている属性を一覧できます。
find はファイルシステムを直接たどります。索引を使わないので死角がなく、そのかわり対象のツリーが大きいほど時間がかかります。find . -name "*.log" -size +10M のような条件は、索引の状態に関係なく答えが出ます。
grep -r は歩きながら中身を読みます。近年よく使われる ripgrep や fd は、初期状態で隠しファイルと .gitignore に載っているファイルを飛ばします。ソースコードの中では便利な既定値ですが、それ以外の場所では取りこぼしの原因になります。grepで見つかるのに rg で出てこないのは不具合ではなく、この既定値の違いです。
| 手段 | 索引を使う | 隠しファイル | 無視設定の対象 | 大きなツリーでの速さ |
|---|---|---|---|---|
| Spotlight・ファインダ検索 | 使う | 条件指定が必要 | 見る | 一瞬 |
| mdfind | 使う | Spotlightと同じ | 見る | 一瞬 |
| find | 使わない | 見る | 見る | 遅い |
| grep -r | 使わない | 見る | 見る | 遅い |
| rg・fd | 使わない | 既定では飛ばす | 既定では飛ばす | 速い |
この表は行ではなく列で読みます。どれが優れているかではなく、いま走らせる検索で「どの死角なら許容できるか」で選ぶ、という読み方です。
索引そのものを点検する順番
シェルからは見えているのに、画面の検索では一切出てこない。この状態なら、問題は検索語ではなく索引の側にあります。点検は順番が決まっていて、最後の手段に飛びつかないことが要点です。
まず mdutil -s / で起動ディスクの索引作成が有効かを確認し、疑わしい外付けディスクがあれば同じコマンドを向けます。次にシステム設定のSpotlightから「検索のプライバシー」を開いて中身を読みます。ここは登録が溜まりやすく、親フォルダを一度入れただけで、その下にあるすべてが結果から消えます。続いてフォルダ名の末尾が .noindex になっていないか、目的のファイルがzipやディスクイメージの中に無いかを確かめます。
この4つを通してから、初めて索引の作り直しを検討します。sudo mdutil -E / はそのボリュームの索引を消して作り直しますが、処理は背後で走り、内蔵ディスクの容量によっては数十分から数時間かかります。その間の検索結果は不完全なままです。索引が壊れているときには正しい対処で、プライバシーの一覧に入っていただけのファイルには時間の無駄になります。
検索の後に起きていることを数える
検索は目的ではありません。目的は、見つけたファイルの名前を変える、移動する、別のファイルと見比べる、パスを渡してコマンドを走らせる、のどれかです。時間が溶けているのは、探す工程ではなく、この「見つけた後」の工程です。
流れを数えると形が見えます。ファインダの検索で結果が出る。それをシェルで処理するには、選択してCommand+Option+Cでパスをコピーし、窓を切り替えて貼り付ける。逆にシェルで見つけたパスの中身を目で確かめたいときは、また窓を戻す。1回あたりは数秒ですが、1日に何十回も繰り返す動作です。難しさではなく回数が問題になります。
ここで効いてくるのが、フォルダとターミナルとAIが同じ窓にあるという配置です。検索結果とコマンド入力が同じ作業ディレクトリを共有していれば、パスのコピーと窓の切り替えがまるごと消えます。この配置で何ができるかはできることにまとめてあり、2画面型やターミナル常駐型など、別の問題を解いている道具との違いは他のファイル管理との比較で整理しています。導入前に費用面を確かめたい場合は料金を見てから判断できます。
道具を替える前に、まず1週間だけ回数を数えることをすすめます。検索の後に窓を切り替えた回数が少ないなら、この記事の前半で挙げた設定の見直しだけで足ります。数が多いなら、それは検索の問題ではなく配置の問題です。
よくある質問
Spotlightで出るのにファインダの検索で出ないのはなぜ?
2つは同じ索引を使いますが範囲が違います。Spotlightはアプリやメール、カレンダーまで含めて機械全体から拾い、ファインダの検索はファイルとフォルダだけを、設定した範囲の中で探します。ファインダの設定で「現在のフォルダ内を検索」にしてから、必要に応じて範囲を広げると差が説明できます。
Spotlightの索引を作り直すとどれくらいかかる?
sudo mdutil -E / で索引を消して作り直せますが、処理は背後で進みます。内蔵ディスクの容量と書類の数によって、数十分で終わることも数時間かかることもあります。終わるまで検索結果は不完全なので、先に検索のプライバシーの一覧とボリュームの索引状態を確かめるほうが早く解決します。
zipファイルやディスクイメージの中は検索できる?
できません。Appleのサポートページでも、アーカイブの中のファイルを探すときは、まずアーカイブを開いてから検索し直すよう案内されています。圧縮された中身は索引に取り込まれないため、展開するかイメージをマウントして索引が作られるのを待つ必要があります。
grepでは見つかるのにripgrepで出てこないのはなぜ?
ripgrepとfdは、初期状態で隠しファイルと .gitignore に載っているファイルを飛ばすためです。ripgrepなら -uu、fdなら -HI を付けると、この既定値が無効になります。ソースコード以外の場所を探すときは、この違いが取りこぼしの原因になりやすい点です。