Macで拡張子を指定して検索する|Finderの条件行と mdfind

Finderの検索欄に「.psd」と打つと、名前にpsdが入ったファイル、本文にpsdという文字を含む書類、まったく関係のなさそうな項目が一緒に並びます。「種類」を「イメージ」にしても、PNGやJPEGは残ったままです。Macで拡張子を指定して検索するときにこれが起きるのは、Finderの検索が「そのファイルが何であるか」を軸に組み立てられていて、拡張子は「そのファイルが何だと名乗っているか」でしかないからです。この記事では、拡張子そのものを条件にできるFinderの隠れた行、検索範囲を毎回狂わせている設定、そしてターミナル側の2つのコマンドの違いを順に整理します。

「種類」で絞っても拡張子では絞れない

macOSはファイルを索引に登録するとき、com.adobe.photoshop-imagenet.daringfireball.markdown のような、ドメイン名を逆さにした形式の識別子を割り当てます。Finderの検索条件にある「種類」は、この識別子を見て絞り込んでいます。一方で拡張子は、ファイル名の末尾に付いた数文字にすぎません。多くの場合は拡張子から識別子が決まりますが、対応関係は固定でもなければ、すべてのMacで同じでもありません。

ここから2つのずれが生まれます。1つ目は、「種類」が拡張子より広いことです。「種類が画像」は、システムが画像として認識できる形式をすべて含みます。Photoshopのファイルだけを取り出したいという要求は、この条件では表現できません。

2つ目は少し厄介です。ある拡張子がどの識別子になるかは、そのMacにどのアプリが入っているかで変わります。アプリが「自分はこの形式を扱う」と宣言する仕組みだからです。同じ拡張子のファイルが、会社のMacとノートで違う識別子として記録されることがあり、片方で完璧に動いていた保存済みの検索が、もう片方では違う結果を返す原因になります。

自分のMacで実際にどう登録されているかは、ターミナルで mdls -name kMDItemContentType にファイルのパスを続けて実行すれば分かります。返ってきた値が、「種類」の条件が照合している相手そのものです。検索結果が多すぎるときも少なすぎるときも、この1行で説明が付くことがほとんどです。

使い分けは単純です。「このフォルダの画像を全部」なら「種類」が正しい道具です。「.psdだけを、ほかは一切含めずに」なら「種類」は向いておらず、拡張子を直接照合する必要があります。

「ファイル拡張子」の条件行を出す

Finderの検索には、まさにそのための条件行が用意されています。ただし最初は表示されていません。目的のフォルダを開いてCommand+Fキーを押し、検索欄の下、右端にある+ボタンをクリックします。条件の行が1つ現れ、既定では「種類」になっています。この行の左端のポップアップメニューをクリックし、一覧の下のほうにある「その他」を選びます。

属性の長い一覧が開き、上部に検索欄があります。ここに「拡張子」と入力すると「ファイル拡張子」が見つかります。選ぶと「ファイル拡張子が◯◯である」という形の行になり、値を入れる欄が現れます。ここには先頭のピリオドを付けずに psd とだけ入れます。検索範囲を「このMac」ではなく現在のフォルダにしておけば、名前が本当にその拡張子で終わるファイルだけが並びます。

同じ属性一覧には、覚えておく価値のある項目があと2つあります。「RAWクエリ」は、メタデータの問い合わせ文をそのまま書ける行です。用意された条件行では表現できない質問を投げるときの逃げ道になります。もう1つは「システムファイル」で、「システムファイルを含む」「システムファイルを含まない」を切り替えられます。探しているものがアプリケーションの内部やライブラリフォルダの中にあるとき、この行がないと結果に出てきません。

条件行を開かずに済ませる近道もあります。最初のポップアップで「名前」を選び、次のポップアップで「で終わる」を選んで、.psd とピリオド込みで入力する方法です。archive.psd という名前のフォルダも引っかかるので厳密さは落ちますが、3クリックで済みます。条件を複数並べたときの挙動について、Appleの資料は次のように書いています。

検索結果には、すべての条件と一致する項目のみが表示されます。たとえば、最初の条件に名前が「S」で始まる項目を検索するように指定してから、今日作成された項目を検索する条件を追加した場合は、検索結果には名前が「S」で始まる今日作成された項目のみが表示されます。 出典: support.apple.com

Optionキーを押しながら+ボタンをクリックすると記号が変わり、条件のグループを追加できます。「次のいずれかの条件を満たす」を選べば、.cr2.nef.arw のどれかに当たるもの、といった聞き方ができます。1つのファイルが3つの拡張子で終わることはないので、複数の形式をまとめて探すときは必ずこのグループが要ります。

検索の範囲が毎回「このMac」に戻る

検索がおかしいと感じる原因の多くは、条件ではなく範囲にあります。「Finder」>「設定」>「詳細」を開き、「検索実行時」の項目を見てください。選べるのは、Mac全体を検索する、現在開いているフォルダを検索する、前回指定した範囲を使う、の3つです。

初期設定ではMac全体が選ばれています。案件のフォルダを開いてCommand+Fキーを押し、拡張子を入力した人が見ているのは、ディスク全体の結果です。目的のファイルは、キャッシュやダウンロードの中の同じ拡張子のファイルに埋もれます。結果の上に並ぶ「このMac」とフォルダ名のボタンを押せばその場では直りますが、設定を変えれば毎回直ります。

範囲にはもう1つの側面があります。Spotlightの索引に入っていないものは、条件をどう組んでも出てきません。「システム設定」>「Spotlight」>「検索プライバシー」には索引から除外する場所の一覧があり、その中身はFinderの検索から見えません。外付けドライブ、ネットワーク上のボリューム、ディスクイメージには、そもそも索引が作られていないことがあります。外付けドライブで検索して何も出ないとき、報告されているのは「ファイルが無い」ではなく「索引が無い」です。

条件をスマートフォルダとして残す

条件行で組み立てた検索は保存できます。検索欄の下の「保存」をクリックすると、スマートフォルダになります。開くたびに条件を実行し直す、保存済みの問い合わせです。「サイドバーに追加」を選んだままにしておけば、Finderのサイドバーに並び、常に最新の答えが入っているフォルダのように振る舞います。Option+Command+Nキーで、ゼロから作ることもできます。

何度も繰り返す質問には、この形が合っています。案件フォルダの中で「ファイル拡張子が sketch である」を保存しておけば、その案件のSketchファイルの一覧が、更新の手間なしで手に入ります。あとから条件を直すときは、開いてから操作ボタンの「検索条件を表示」を選びます。

注意すべき点は、スマートフォルダが入れ物ではなく窓だということです。ファイルは元の場所にあります。スマートフォルダから外へドラッグすると、元のファイルが移動します。スマートフォルダ自体を捨てても、消えるのは保存した条件だけです。

ターミナルで同じことを聞く

同じ質問に答えるコマンドは2つあり、仕組みがまったく違います。

mdfind はFinderと同じ索引に問い合わせます。速い代わりに、弱点も同じです。ファイル名の属性をパターンと照合する形が、いちばん正確です。

mdfind -onlyin ~/Projects "kMDItemFSName == '*.psd'"

この比較は既定で大文字と小文字を区別します。Cover.PSD という名前で保存されたファイルは漏れます。閉じ引用符の直後に c を足すと区別しなくなります。

mdfind -onlyin ~/Projects "kMDItemFSName == '*.psd'c"

短く書ける -name は便利そうに見えますが、同じ意味ではありません。-name はファイル名のどこにあっても部分一致します。mdfind -name md.md で終わるファイルに加えて notes.mdx も返しますし、名前の途中にその2文字が入っているものも拾います。拡張子を扱うときは、属性を明示した比較のほうを使ってください。

find は索引に一切触れません。ディレクトリを実際に辿りながら名前を比べます。

find ~/Projects -type f -name "*.psd"

大きなツリーでは遅くなりますが、mdfind が届かない場所で動きます。除外したフォルダ、差したばかりのボリューム、索引の無いドライブが該当します。-iname にすれば大文字と小文字を区別しません。出力が1行1パスなので、そのまま次の処理へ渡せるのが本当の利点です。

方法 拡張子で正確に絞れるか 大文字小文字の無視 索引が要るか 結果を次の処理に渡せるか
Finderの「ファイル拡張子」 絞れる する 要る 渡せない
Finderの「名前」「で終わる」 ほぼ絞れる(フォルダも当たる) する 要る 渡せない
mdfindkMDItemFSName 絞れる c を付ければする 要る 渡せる
mdfind -name 部分一致になる する 要る 渡せる
find -name 絞れる -iname でする 要らない 渡せる

速さの差は実務では判断材料になります。数十万件ある起動ディスクのホームフォルダでも、mdfind は事前に作られたデータベースを読むだけなので1秒かかりません。find は同じ範囲でディレクトリを順に開いていくため、体感できるほど待たされます。差し込んだ直後の外付けドライブでは関係が逆転し、索引が出来上がるまで mdfind は何も返さないのに対し、find はすぐにパスを吐き始めます。

日本語のファイル名で起きる取り違え

日本語環境では、画面に見えている名前とディスク上の名前がずれている場面があります。書類、ダウンロード、デスクトップといったフォルダは、システムの言語に合わせて日本語で表示されますが、ディスク上の名前は英語のままです。findmdfind -onlyin に渡すのはディスク上の名前のほうで、日本語の表示名を打っても場所として解釈されません。

もう1つ、濁点と半濁点の扱いがあります。APFSでは、濁点を1文字として持つ形(結合形)と、清音と濁点記号に分けて持つ形(分解形)を同じ名前として扱います。「ポートフォリオ.pdf」という名前が2通りの符号化で保存されていても、ファイルシステムは同じ名前とみなします。ただし、コマンドの結果をテキストとして扱う段階では別物になり得ます。find の出力をそのまま grep に渡して日本語で絞り込むと、目の前では同じに見える文字列が一致しないことがあります。拡張子は半角英数字なので、拡張子で絞る限りこの問題は起きません。日本語の語で絞りたくなったときだけ思い出せば充分です。

拡張子が画面に出ていないときの確認

拡張子で検索するという発想は、拡張子が見えていることを前提にしています。初期状態では、見えていないファイルが少なくありません。ファイルごとに「拡張子を非表示」という設定があり、Finderはそれをファイル単位で尊重します。全体をまとめて上書きする設定はFinderの設定にあります。「Finder」>「設定」>「詳細」の「すべてのファイル名拡張子を表示」を先に入れておくと、探している対象そのものが画面に出るようになります。

この設定が変えるのは表示だけです。report と表示されているファイルは、ディスク上では report.pdf のままです。「ファイル拡張子」の条件行も mdfind も、表示に関係なく見つけます。変わるのは、出てきた結果が正しいかどうかを目で確かめられるかどうかです。拡張子を変更しようとしたときの警告も同じ画面で切り替えられますが、これは切らないほうが安全です。

道具の側で減らせる往復と、減らせない往復

ここまでの手順のうち、Finderで完結するものと、ターミナルへ移らないと終わらないものがはっきり分かれます。結果を一覧して開くだけならFinderで足ります。結果を次の処理へ渡す、たとえば見つけた .psd をまとめて別のフォルダへ移す、ファイル名の一部を書き換える、といった段になると、必ずターミナルが要ります。そして多くの人は、Finderで見つけた場所をターミナルに手で入力し直しています。

この往復は、条件の組み方をいくら磨いても短くなりません。減らせるのは、画面の構成を変えたときだけです。フォルダとターミナルとAIが同じ窓にある状態であれば、見つけた場所がそのまま作業ディレクトリになり、パスを打ち直す工程が消えます。何がどこまで同じ窓に収まるのかはできることにまとまっており、既存のファイル管理アプリとの違いは他のファイル管理との比較で項目ごとに並べています。

判断の材料としては、費用と、扱える言語の2つも見ておくと迷いが減ります。金額と条件は料金に、日本語を含む表示言語の対応状況は対応言語にあります。導入前に引っかかりやすい点はよくある質問にまとめられています。

よくある質問

Finderで拡張子だけを指定して検索するにはどうすればよいですか?

Command+Fキーで検索を始め、検索欄の下の+ボタンを押します。現れた行の左端のポップアップで「その他」を選び、一覧から「ファイル拡張子」を選びます。値は先頭のピリオドを付けずに入力します。あわせて検索範囲を「このMac」から現在のフォルダに切り替えてください。

「種類」で絞っているのに違う形式のファイルが混ざるのはなぜですか?

「種類」はファイル名ではなく、システムが割り当てた形式の識別子を見ているためです。「画像」を選ぶとPNGもJPEGもHEICも含まれます。特定の拡張子だけを取り出したいときは「ファイル拡張子」の条件行を使うか、ターミナルで kMDItemFSName を比較してください。

外付けドライブで検索しても何も出てきません。故障でしょうか?

多くの場合はSpotlightの索引が作られていないだけです。外付けドライブ、ディスクイメージ、ネットワーク上のボリュームは索引が無いことがあります。索引を使わない find コマンドをマウント先に対して実行すれば、ファイルがあるかどうかを直接確かめられます。

mdfind と find はどちらを使えばよいですか?

起動ディスクの中を素早く探すなら mdfind です。事前に作られた索引を読むので、数十万件でも1秒かかりません。索引が無い場所、除外設定をした場所、差した直後のドライブを探すときは find を使います。結果を次の処理へ渡す点はどちらも同じです。

記事一覧へ戻る