ファイルの検索とは|索引と探索の違いで詰まる場所が決まる
確かに保存したはずのファイルが、検索窓に名前を入れても出てこない。ファイルの検索という言葉で調べ始める人の多くは、この一点で止まっています。結論から書くと、Macのファイル検索は仕組みの違う2つの経路に分かれていて、出てこない理由のほとんどは「片方の経路しか使っていない」ことに由来します。ここでは、その2つの経路が何を見ているのか、どこに届かないのか、そして自分がいま投げている質問がどちらの経路で答えられるものなのかを整理します。
索引を引く検索と、ディスクを歩く検索
ファイルを探す方法は、大きく2種類しかありません。あらかじめ作っておいた目録を引く方法と、その場でディスクを順に見て回る方法です。
目録を引く方法が、MacではSpotlightと呼ばれる仕組みです。OSが裏側でファイルの名前・種類・作成日・更新日といった属性と、対応した形式の本文を読み取り、検索用のデータベースに書き込んでいます。検索窓に文字を打った瞬間に候補が出るのは、その時点でディスクを見に行っているからではなく、すでに出来上がった目録を引いているからです。速さの正体はここにあります。
もう一方の、ディスクを歩く方法がターミナルのfindコマンドです。指定した場所から下のフォルダを順に開き、条件に合う名前を突き合わせていきます。目録に頼らないので、目録が壊れていても、作られていない場所でも答えが返ります。代わりに、件数が多ければそれだけ時間がかかります。50万件規模のホームフォルダを端から歩けば、数十秒は待つことになります。
この2つは優劣の関係ではなく、答えられる質問が違います。目録は「更新日が先月で、種類がPDFで、本文に請求という語が入っているもの」のような複合条件に強く、ディスクを歩く方法は「この外付けドライブの直下にある、拡張子がmovのもの」のような場所を限った質問に強い。詰まっている人の多くは、目録に載っていない対象に対して、目録を引く道具で質問を投げ続けています。
索引が作られる時と、載らない場所
目録はいつでも最新とは限りません。Appleは索引が作られる時点について、公式のサポート文書で次のように書いています。
Indexing happens when you first set up your device, after you install a software update or upgrade, and as data changes on your device. Depending on the amount of data on your device, Spotlight indexing can take hours or even days. 出典: support.apple.com
初期設定の直後、OSのアップデート直後、そしてデータが変わったとき。この3つの契機で索引作りが走り、データ量によっては数時間から数日かかるとされています。買い替えた直後やアップデート直後に検索が効かないのは故障ではなく、目録がまだ出来上がっていない状態です。
載らない場所も決まっています。1つ目は、検索から除外するよう設定されたフォルダやディスクです。Appleは除外の副作用について、除外すると一部のアプリの更新通知が届かなくなる場合があり、内蔵ディスク全体を除外すると更新が通知されなくなると注意しています。2つ目は、名前が.noindexで終わるフォルダの中身です。3つ目は、本文の読み取りに対応していない形式のファイルで、この場合は名前や日付では見つかっても、中に書かれた語では見つかりません。4つ目は、書類の中に入れ子になっているもので、ZIPの中身、マウントしていないディスクイメージの中身、写真やメールのライブラリの内部が該当します。
外付けドライブとネットワーク上の共有も、扱いが別です。つないだ直後は索引が無いため、目録を引く検索には出てきません。索引を作らせるか、ディスクを歩く方法に切り替えるかの二択になります。
Finderの検索窓は、思った場所を見ていないことがある
Finderのウインドウで文字を打つと検索が始まりますが、このとき検索の範囲は2つあります。開いていたフォルダの中だけを見る範囲と、Mac全体を見る範囲です。ウインドウ上部にその切り替えが並んでいて、どちらが選ばれているかで結果が丸ごと変わります。
さらに厄介なのは、この初期値が設定で決まっていることです。Finderの環境設定には検索実行時の範囲を指定する項目があり、ここが「常に現在のフォルダを検索」になっていれば、デスクトップから検索してもデスクトップの中しか見ません。「出てこない」と言われるケースのうち、相当数がこの1項目で説明できます。
もう1つ見落とされるのが、打った文字がどこに当たっているかです。既定では名前と本文の両方が対象になるため、名前に入っていない語でも本文が当たれば出てきます。逆に、名前だけで絞りたいのに本文が当たって件数が膨らむ、という詰まり方もします。この場合は検索条件の行を足して、対象を名前に限定します。条件を足した状態は保存でき、保存したものはスマートフォルダとしてサイドバーに置けます。毎回同じ条件を打ち直している作業は、ここで一度きりの作業に変えられます。
ターミナル側の3つの道具は、答える質問が違う
コマンドラインには、性格の違う道具が最初から入っています。
| 道具 | 見ているもの | 得意な質問 | 弱い点 |
|---|---|---|---|
| mdfind | Spotlightの索引 | 属性と本文を混ぜた複合条件 | 索引に載っていない場所には届かない |
| find | ディスクそのもの | 場所と名前と日付を限った質問 | 件数が増えると時間がかかる |
| grep | ファイルの中身 | 本文に確かに含まれる文字列 | 対象を先に絞らないと現実的でない |
mdfindはFinderの検索窓と同じ索引を引いています。つまり、Finderで出てこないものはmdfindでも出てきません。同じ結果を別の窓で確かめても意味がないのは、この理由によります。索引の状態を疑うなら、mdutil -s /のように索引が有効かどうかを直接尋ねる必要があります。
findは索引を使わないため、対照実験の役割を持ちます。findで見つかってmdfindで見つからないなら、ファイルは存在していて目録の側に問題がある、と切り分けられます。両方で見つからないなら、探しているのは別の場所か、名前の記憶が違っています。
grepは本文を直接読みます。ホームフォルダ全体に対して無条件に走らせる使い方は現実的ではありませんが、findで候補を数百件まで絞ってから渡せば、索引が本文を読めない形式に対しても中身で当たれます。GNUの実装についてはGNU Coreutilsなどのドキュメントが公開されており、macOSに入っているBSD系の実装とは引数の扱いが異なる点も確認できます。
自分が覚えていることから、使う経路を決める
道具の一覧を覚えるより、質問の形から逆算するほうが速く着きます。探している人が覚えているのは、だいたい次の3つのどれかです。
- 名前の一部を覚えている。この場合は名前だけに対象を絞る。本文が当たって件数が膨らむのを止めるのが先決です
- 中に書いてあった語を覚えている。本文を読める形式なら索引が答えます。読めない形式なら、場所を絞ってから中身を読む道具に渡します
- 名前も中身も覚えていないが、いつ頃・どのアプリで作ったかは覚えている。この場合は日付と種類で絞るのが最短で、名前で当てようとすると時間だけが過ぎます
この3つに加えて、覚えている内容が「誰から受け取ったか」である場合もあります。メールの添付やメッセージ経由で届いたファイルは、受信したアプリの管理下に置かれていることが多く、その場合はファイルとして探すより、受け取った経路のアプリ側で探すほうが早く着きます。ファイル管理の側で探し続けても、実体がアプリの内部にあるうちは出てきません。
3番目が最も多く、そして最も道具の選択を間違えやすい型です。「先月、会議のあとに書いた」という記憶は、更新日の範囲と種類という2つの条件に翻訳できます。翻訳せずに語を打ち続けている限り、何回打っても出てきません。
詰まっているのは検索ではなく、窓の往復であることが多い
検索が当たったあと、次にやることはだいたい決まっています。場所を確かめる、同じ場所の他のファイルを見る、ターミナルでそのフォルダに移動する、AIに中身を渡して要約させる。この一連の流れで、Finderとターミナルと対話の窓を行き来することになります。
ここが時間を食っている場合、検索の腕を上げても総量は減りません。仮に1回の往復に20秒かかり、1日に40回発生するとすれば、それだけで13分です。検索そのものを速くする工夫と、フォルダとターミナルとAIが同じ窓にある状態にして往復を消す工夫は、別の問題に対する別の答えです。自分の詰まりがどちらなのかは、1日のうちで窓を切り替えた回数を数えれば判別できます。
判断の材料をどこで確かめるか
どこまでを標準の仕組みで済ませ、どこから別の道具に任せるかを決めるには、道具の側が何を引き受けるのかを先に見ておくのが確実です。1つの窓の中にフォルダの一覧とターミナルと対話が並ぶ構成で何ができるかはできることに整理されています。2画面表示や転送用のクライアントといった既存の分類と、どこが重なってどこが違うのかは他のファイル管理との比較で並べて確認できます。
検索して見つけたファイルを、机を離れたあとに続けて扱いたい場合は、手元の端末から同じ状態に戻れるかどうかが分かれ目になります。その経路についてはiPhone・iPadから続きをにまとまっています。表示の言語をどこまで切り替えられるかは対応言語、費用の考え方は料金、導入前に出やすい疑問はよくある質問がそれぞれ受け持っています。
決めるべき順番は変わりません。まず、出てこない原因が範囲の設定なのか索引の未作成なのかを切り分ける。次に、自分の質問が名前・本文・日付のどれで答えられるかを決める。最後に、検索の後ろにある窓の往復が時間を食っているかを数える。この3つを踏んでから道具を選べば、選び直しは起きません。
よくある質問
Finderで見つからないファイルが、ターミナルでは見つかるのはなぜ?
Finderの検索窓とmdfindは同じSpotlightの索引を引いているのに対し、findコマンドはディスクを直接歩くためです。findで見つかってFinderで見つからない場合、ファイル自体は存在していて索引の側に問題があると切り分けられます。除外設定、索引の作成中、名前が.noindexで終わるフォルダの中、のいずれかが原因であることが多いです。
外付けドライブの中身が検索に出てこないときはどうすればよい?
つないだ直後は索引が作られていないため、索引を引く検索には出てきません。mdutil -s /Volumes/ドライブ名 で索引が有効かどうかを確認し、無効であれば有効にするか、findコマンドのように索引を使わない方法で探します。索引作りはデータ量によっては数時間から数日かかるとAppleが案内しています。
名前は覚えていないが中身は覚えている場合、どう探すのが速い?
本文の読み取りに対応した形式であれば、索引がそのまま答えます。対応していない形式の場合は、日付や種類や場所で候補を数百件まで絞ってから、中身を読む道具に渡すのが現実的です。ホームフォルダ全体に対していきなり本文検索をかける方法は、時間がかかるうえに件数も膨らみます。
同じ条件で毎回検索している作業を減らせる?
Finderの検索結果は条件を保存でき、保存したものはスマートフォルダとしてサイドバーに置けます。更新日の範囲と種類とフォルダを組み合わせた条件を1度作っておけば、次からは開くだけで同じ結果が得られます。条件は後から編集できるため、運用しながら精度を上げていく形にできます。