mac ファイル検索ターミナルの使い分け|画面で探すか、打って探すか

ファインダの検索窓に打ち込んで、結果が多すぎるか少なすぎるかのどちらかになる。仕方なくターミナルを開いて同じものを探し直す。mac ファイル検索ターミナルという組み合わせで調べる人は、たいていこの往復を1日に何度も繰り返しています。必要なのはコマンドの一覧ではなく、どちらの画面が今の問いに答えられるのかを先に判断する基準です。この記事では、その分かれ目と、コマンドが名前を取り違える具体的な仕組み、そして往復そのものを減らす考え方を整理します。

質問の形が、探す場所を決める

コマンドを覚えるより先に決めるべきは、いま自分が何を聞いているのかです。探し方は4つの型に分かれ、型が決まれば道具は自動的に決まります。

  • 「どこにあるか大体分かっている1件を開きたい」。これは検索ではなく移動です。Spotlightかファインダで足ります
  • 「条件に当てはまるものを全部並べたい」。件数が読めない問いで、条件を式で書けるターミナルが向きます
  • 「候補を見比べて選びたい」。プレビューとサムネイルが要るのでファインダです
  • 「見つけたもの全部に同じ処理をしたい」。1件ずつ手で処理する話ではないのでターミナルです

この分類が効くのは、失敗の仕方が型ごとに違うからです。1件を開きたいだけなのにコマンドを打つと、正しい結果が出るまでに条件を書き直す時間がかかります。逆に、200件に同じ処理をしたいのにファインダで始めると、選択と確認の操作がそのまま200回分積み上がります。どちらも道具が悪いのではなく、型を取り違えているだけです。

実務では、1つの作業の中で型が切り替わります。まず条件で絞り込み(ターミナル)、候補を目で確かめ(ファインダ)、決めたものに一括処理をかける(ターミナル)。この行ったり来たりが避けられないという前提に立つと、本当に問題なのは検索そのものではなく、切り替えのたびに払っている手間だと分かります。

ファインダの検索では書けない条件

ファインダの検索は、条件行を追加すれば種類・日付・サイズ・タグまで指定できます。それでも表現できない問いがあり、そこがターミナルの独壇場になります。

  • 階層の深さを限定する。「このフォルダの直下2階層までだけを見る」は find . -maxdepth 2 で書けます。ファインダの検索は範囲を指定できても深さは指定できません
  • 別のファイルとの相対比較。「このファイルより新しいものだけ」は find . -newer 基準ファイル です。絶対日付ではなく基準を指定する書き方は条件行にありません
  • 空のフォルダや壊れたシンボリックリンクを探す。find . -type d -emptyfind . -type l ! -exec test -e {} ; -print に相当する条件は用意されていません
  • 権限や所有者で絞る。find . -perm +111-user は、共有ディスクを整理するときに効きます
  • 件数を数える。「該当が何件あるか」だけを知りたい場面では mdfind -count が最短です

もう1つ、ファインダの見た目からは分からない属性を読む手段があります。mdls ファイル名 を実行すると、Spotlightがそのファイルについて記録している項目が全部並びます。撮影機材、ページ数、著作者、取り込み日時などが入っており、条件付き検索の材料としてそのまま使えます。どの属性が使えるかを調べてから mdfind の式を組み立てる、という順番になります。

速さと表現力は別の軸である点も押さえておきます。mdfind は作成済みの索引を引くので即座に返りますが、find はフォルダを1つずつ開いて歩くため、対象が大きいほど時間がかかります。数十万件が入ったホームフォルダなら、体感で数秒対ほぼゼロの差になります。その代わり索引の側には死角があり、検索のプライバシーに登録された場所、索引が無効な外付けディスク、zipファイルの中身は結果に出ません。どちらが優れているかではなく、いまの問いがその死角を許容できるかで選びます。

逆に言えば、ここに挙げた形の問いを持っていないなら、ターミナルを開く理由はありません。名前の一部で探すだけならファインダのほうが速く、しかもアイコン付きで返ってきます。

コマンドが「同じ名前」を取り違えるとき

ターミナルで探しているのに何も出てこない。この状態で最も見落とされるのが、ファイルシステムとコマンドで名前の照合ルールが違うという点です。実際に確かめると差がはっきり出ます。

macOSの起動ボリュームは、既定では大文字と小文字を区別しません。Report.md というファイルがあるとき、ls report.md は問題なく開きます。ところが find . -name "report.md"0件を返します。マニュアルページの説明はこうです。

-name pattern True if the last component of the pathname being examined matches pattern. 出典: macOSに付属する find(1) のマニュアルページ

一致するかどうかだけが書かれていて、大文字と小文字の扱いには触れていません。実際の動作は区別する側で、-iname を使えば区別しなくなります。ファイルシステムが区別しないからコマンドも区別しないだろう、という思い込みがそのまま取りこぼしになります。

さらに厄介なのが、濁点や半濁点の記録のされ方です。日本語のファイル名には、1文字として記録される形と、文字と濁点を分けて記録される形の2通りがあります。古いフォーマットのディスクから移してきたファイルや、一部のアプリが作ったファイルは後者になっていることがあります。この状態のファイルは、ls で名前を打てば開けますし、ls ガ* のような展開でも出てきます。ところが find . -name "ガイド.txt" は0件、ls | grep "ガイド" も0件になります。前者はファイルシステム側が照合しているのに対し、後者はコマンドが文字列をそのまま比べているためです。

対処は難しくありません。日本語のファイル名で findgrep が空振りしたら、濁点を含まない部分だけで絞る、拡張子と日付で絞ってから目で確認する、あるいはフォルダの一覧から名前をコピーして貼り付ける。打ち直さないことが要点です。

ターミナルが向かない場面をはっきりさせる

コマンドを使い始めると、何でもコマンドで済ませたくなります。向かない場面を先に決めておくほうが結果的に速くなります。

まず、候補を見比べる作業です。画像や動画、設計データのように、中身を見ないと判断できないものは一覧のサムネイルとスペースキーのプレビューにかないません。ファイル名だけで判断しようとして、間違ったほうを消すのが典型的な事故です。

次に、少数の手直しです。5件のファイル名を個別に直すなら、一覧で選んで名前を変えるほうが確実です。コマンドでの一括置換は、規則が全件に当てはまることが分かってから使うものです。

そして取り消しの有無です。ファインダからの削除はゴミ箱を経由するので戻せますが、rm は戻せません。移動も同じで、mv は上書きの確認をしません。同名のファイルがある場所へ移動させると、確認なしで消えます。ここは慣れの問題ではなく、仕組みとして戻せないという違いです。

最後に、他のアプリへの受け渡しです。編集ソフトへドラッグする、メールに添付する、共有メニューから送る。この経路はファイル管理の画面にしかありません。

作業ディレクトリを合わせる手間が本体

型に応じて画面を切り替えると決めた瞬間、次の問題が出てきます。いま見ているフォルダと、いまコマンドが立っているフォルダが違う、という状態です。

手段はいくつかあります。ファインダで対象を選んでcommand+option+Cを押すとフルパスがコピーでき、cd の後ろに貼り付けられます。フォルダのアイコンをターミナルの窓へドラッグすると、パスが文字列として挿入されます。システム設定のキーボードからキーボードショートカットを開き、サービスの中にある「フォルダに新規ターミナル」を有効にしておけば、右クリックからその場所で開けます。逆向きなら、ターミナルで open . と打つと今いる場所がファインダで開きます。

貼り付けたパスがそのまま動かないこともあります。Appleのターミナルユーザガイドは、名前の付け方についてこう書いています。

ファイル名およびフォルダ名には、文字、数字、ピリオド、およびアンダースコア文字を含めることができます。その他のほとんどの文字(スペース文字など)は使用しないでください。一部のファイルシステムではそうしたその他の文字(スペースなど)の使用が許可されていますが、そうした文字を含むパス名は一重引用符または二重引用符で囲むことをお勧めします。 出典: support.apple.com

つまり、日本語や空白を含むパスは引用符で囲むのが前提です。command+option+Cでコピーしたパスは囲まれていないので、貼り付けた後に自分で囲む必要があります。ここを飛ばして実行すると、空白の位置で引数が割れ、まったく別の場所に対して処理が走ります。

問題は、この一連の操作が数秒で終わることです。数秒だから対策を打たずに済ませてしまい、1日に40回繰り返しても誰も数えない。難しさではなく回数が効いてくる種類の手間です。

見つけた後の処理を安全に流す

条件で絞り込めたら、次は結果に処理をかけます。ここでの原則は、先に表示して読むことです。

find は、条件の後ろに何も付けなければパスを表示するだけです。-delete-exec を書き足す前に、まず表示だけで実行して、件数と中身を目で確かめる。想定より桁が1つ多ければ、条件のどこかが間違っています。

一括処理に渡すときは、区切り文字を明示します。find . -name "*.log" -print0xargs -0 を組み合わせると、名前に空白が入っていても1件として扱われます。-exec コマンド {} + の形でもかまいません。区切りを既定のままにすると、空白を含む名前が2つの引数に割れて、存在しないパスに対して処理が走ります。

削除を伴う処理は、段階を分けます。まず退避用のフォルダへ mv で移し、しばらく置いてから消す。この2段階にしておけば、条件を間違えたときに戻せます。ワイルドカードを使う場合は、実行するコマンドの先頭に echo を付けて空打ちし、展開結果を読んでから外すのが確実です。

窓を切り替えた回数を数える

ここまでの内容は、どれも1つの前提に乗っています。フォルダを見る画面と、コマンドを打つ画面が別々にある、という前提です。

流れを数えると形が見えます。条件で絞る(ターミナル)。中身を確かめたいのでパスをコピーして窓を移る(ファインダ)。判断して戻る(ターミナル)。処理をかける。1回あたりは数秒でも、絞り込みの条件を3回書き直せば、その往復も3倍になります。検索が下手なのではなく、確認のたびに場所を移っているだけです。

ここで効いてくるのが、フォルダとターミナルとAIが同じ窓にあるという配置です。一覧とコマンド入力が同じ作業ディレクトリを共有していれば、パスのコピーも引用符の付け直しも窓の切り替えも要りません。この配置で具体的に何ができるのかはできることに整理されていて、2画面型やターミナル常駐型といった別の課題を解いている道具との違いは他のファイル管理との比較で比べられます。長時間の処理を仕掛けたまま席を離れる使い方を考えているなら、iPhone・iPadから続きをに外出先からの扱いがまとまっています。

道具を替える前に、1週間だけ回数を数えることをすすめます。検索の後に窓を切り替えた回数が10回程度なら、この記事の前半で挙げた使い分けだけで足ります。数十回を超えているなら、それは検索の問題ではなく配置の問題です。

よくある質問

ファインダで見えているファイルがfindで出てこないのはなぜ?

名前の照合ルールが違うためです。macOSの起動ボリュームは既定で大文字と小文字を区別しませんが、find -name は区別します。-iname に変えると一致します。日本語のファイル名で空振りする場合は濁点の記録のされ方が違う可能性が高いので、濁点を含まない部分だけで絞るか、一覧から名前をコピーして貼り付けます。

ターミナルとファインダはどちらを先に開くべき?

答えたい問いの形で決めます。1件を開きたいだけならファインダかSpotlightが速く、条件に当てはまるものを全部並べたい場合や、見つけたもの全部に同じ処理をかけたい場合はターミナルです。候補を見比べる工程だけは、プレビューが使えるファインダに戻すのが確実です。

パスに空白が入っているとコマンドが失敗するのはなぜ?

シェルが空白を引数の区切りとして扱うためです。Appleのターミナルユーザガイドも、空白などを含むパス名は引用符で囲むよう案内しています。ファインダからcommand+option+Cでコピーしたパスは囲まれていないので、貼り付けた後に自分で二重引用符を付けます。

検索結果に一括で処理をかけるとき、何に注意すればいい?

まず条件だけで実行して、表示された件数と中身を読みます。そのうえで -print0xargs -0 の組み合わせか、-exec コマンド {} + の形を使い、名前の空白で引数が割れないようにします。削除は直接行わず、退避用のフォルダへ移してから時間を置いて消すと事故を防げます。

記事一覧へ戻る