Macのfindコマンドで探す|名前と日付で絞り込む書き方
find コマンド mac で検索して来る人の多くは、コマンドの綴りを知りたいのではありません。Finderの検索欄に名前を打ったのに出てこない、出てきたのに開いたら別物だった、ネットで見つけた書き方をそのまま貼ったらエラーになった。その3つのどれかで止まっています。この記事では、macOSのfindが何をする道具なのかを先に確定させ、名前と日付と大きさで絞る書き方を並べ、Linux向けの記事を真似すると動かない箇所と、findではなく索引側を引いたほうが速い場面の見分け方までを順に整理します。
findは索引を引かない。ディレクトリを1段ずつ歩く
macOSでファイルを探す道具は、内部の作りで2系統に分かれます。ひとつはSpotlightの索引を引くもので、Finderの検索欄とコマンドの mdfind がこちらです。もうひとつが今この場でディレクトリを開いて中身を読み、1段ずつ下へ降りていくもので、findがこちらにあたります。
この違いは速さと確実さの取引です。索引は事前に作られているので答えが即座に返りますが、索引に入っていないものは存在しないものとして扱われます。findは索引を持たないので、対象が大きいと時間がかかりますが、そこにあるものは必ず見つかります。
ファイル名がわかっているけどディレクトリの位置が分からないとき、findコマンド(mac/linux)、もしくはmdfindコマンド(macのみ)、locateコマンド(linuxのみ)を使用します。 出典: tech.kurojica.com
Finderの検索欄で見つからなかったものがfindで出てくるのは、この構造から来ています。開発用のディレクトリ、外付けディスク、索引を切ったボリュームの中身は、索引側からは見えません。mdutil -s / を実行するとそのボリュームの索引が有効かどうかが返るので、Finderで出てこない理由がここにあるのかどうかは、その1行で切り分けられます。逆に、書類の中身の文字列で探したいときは、findには中身を読む仕組みがないため索引側の担当になります。
最小の形は3つの部品でできている
findの書き方は、どこから探すか、何を条件にするか、見つけたらどうするかの3つに分かれます。最小の形は次の1行です。
find . -name "invoice.pdf"
. が起点、-name が条件、結果の表示は省略時の既定動作です。起点を書き忘れるとエラーになるので、迷ったら現在のディレクトリを表す . を置きます。ホーム全体を探すなら ~、特定のフォルダなら /Users/admin/Documents のように絶対パスで書きます。
条件で最初に覚える価値があるのは次の3つです。
-inameは大文字と小文字を区別しない名前の一致。人が付けたファイル名は表記が揺れるので、名前で探すときの既定として使う価値があります-type fはファイルだけ、-type dはディレクトリだけに絞ります。同じ名前のフォルダが混ざって結果が読みにくいときに効きます-maxdepth 2は起点から数えて2段までしか降りません。浅い場所にあるはずのものを探すときは、これを付けるだけで待ち時間が変わります
名前がうろ覚えのときは、前後に * を置いて部分一致にします。ここで注意が必要なのは、* を引用符で囲むことです。囲まずに書くとシェルが先に展開してしまい、findには展開後の別の文字列が渡ります。
find . -iname "*見積*" -type f -maxdepth 3
日付で絞る条件は、macOSでは3通りある
「先週いじったはずのファイル」を探す場面では、名前より日付のほうが手掛かりとして確実です。macOSのfindには時刻を条件にする書き方が複数あり、使い分けで手間が変わります。
-mtime は更新日時が何日前かで絞ります。-mtime -7 は7日以内に更新されたもの、+30 は30日より前に更新されたものです。単位を付けない場合は24時間単位で数えるため、今日と昨日の切れ目は日付ではなく実行した時刻から数えた24時間になります。ここを取り違えると、あるはずのものが結果に出てきません。
分単位で追うなら -mmin -30 のように書きます。直前に走らせた処理がどこに何を書いたのかを追う場面では、日単位より分単位のほうが対象が絞れます。
macOSのfindで特に使い勝手がよいのは -newermt です。
find ~/Documents -type f -newermt "2026-09-20" ! -newermt "2026-09-24"
-newermt は日付そのものを直接書けるので、何日前かを頭で計算する必要がありません。後ろに ! を付けたもう1つの条件を重ねると、期間の区切りになります。2つの条件を並べて書くと、findはそれらを「かつ」で結びます。「または」にしたいときだけ -o を明示します。
大きさとパスで絞ると、結果が読める量まで減る
条件は重ねるほど結果が短くなります。日付で絞ってもまだ数百行流れるときは、大きさとパスを足します。
-size は単位を後ろに付けます。c がバイト、k がキロバイト、M がメガバイト、G がギガバイトで、+ が「より大きい」、- が「より小さい」です。単位を書き忘れると512バイト単位のブロック数として解釈されるため、意図しない結果になります。
find ~/Downloads -type f -size +100M
パスで除外するときは -path と否定を組み合わせます。より効くのは -prune で、これは条件に合ったディレクトリの中へ降りるのをやめさせます。除外したいディレクトリが巨大なとき、-path で結果から消すだけでは中身を全部読んだあとで捨てているので、待ち時間は縮みません。
find . -name node_modules -prune -o -type f -name "*.ts" -print
-xdev を付けると、起点と別のボリュームへは降りません。外付けディスクやネットワーク共有をマウントしたまま探すと、そちらまで舐めて数分戻ってこないことがあります。手元のディスクだけを対象にしたいときは、これを既定で付けておく価値があります。
権限のないディレクトリに当たると Permission denied が1行ずつ流れます。結果が読めなくなるので 2>/dev/null で捨てますが、捨てているのはエラーだけで、見つかったものは残ります。
見つけたものを、そのまま次の処理へ渡す
findの本当の使いどころは、探すことより、探した結果をまとめて処理に渡すことです。
-exec は見つかったものを1件ずつコマンドに渡します。末尾を ; ではなく + にすると、まとめて1回で渡すので、件数が多いときは速くなります。
find . -name "*.png" -exec du -h {} +
パイプで渡すときは -print0 と xargs -0 を組にします。ファイル名に空白が入っていると、行を空白で切る既定の動きで名前が2つに割れます。日本語のファイル名には空白が入りがちなので、この組み合わせは事故を減らします。
-delete は条件に合ったものをその場で消します。戻せないので、まず -delete を外した形で走らせ、結果を目で確認してから付ける順序にします。この確認の1手を省くと、条件の書き間違いがそのまま削除になります。
結果を人が読む前提で整えたいときは、findの出力をそのまま別のコマンドへ流します。件数を数えるだけなら | wc -l、名前順に並べ直すなら | sort、大きい順に見たいなら -exec du -h {} + | sort -h のようにつなぎます。findは探す部分だけを受け持ち、並べる仕事と数える仕事は別のコマンドが持っている構造なので、覚える条件を増やすより、つなぎ方を覚えたほうが応用が利きます。
探し方が固まったら、その1行をシェルの別名として登録しておく方法もあります。よく使う条件は毎回打ち直すほど書き間違いが増えるので、起点と段数まで決め打ちにした形で残しておくと、打つ回数そのものが減ります。
Linux向けの記事をそのまま真似すると動かない箇所
findで詰まる原因のうち、最も見つけにくいのがこれです。macOSのfindはBSD系、Linuxで広く使われているのはGNU系で、同じ名前の別の実装です。
| 書き方 | macOS | 備考 |
|---|---|---|
-iname |
使える | 大文字小文字を無視した名前の一致 |
-maxdepth / -mindepth |
使える | 式の途中に書いても全体に効く |
-newermt |
使える | ISO8601形式の日付を直接書ける |
-printf |
使えない | 出力の書式を指定する条件は持たない |
-regextype |
使えない | 正規表現の種類を切り替える指定がない |
-printf が使えないことは、他所の記事をコピーしたときの詰まり方として頻度が高い部分です。出力の形を変えたいなら -exec stat -f "%z %N" {} + のように外部のコマンドへ渡す形に書き換えます。GNU版の書き方をそのまま使いたい場合は、GNU Coreutilsなどの実装を別に導入してコマンド名を分ける方法もありますが、手元とサーバでコマンドの中身が違う状態は別の混乱を生みます。macOSでは man find を引いて手元の実装を確かめるのが最短です。
findで探すか、索引を引くかの分かれ目
道具を選ぶ基準は3つに整理できます。
- 場所の当たりが付いているときはfind。起点を絞れるので、索引の有無に関係なく確実です
- Mac全体のどこかにあるが場所が分からないときは
mdfind。索引を引くので即座に返ります - 書類の中身の文字列で探すときは索引側。findは中身を読みません
索引側の実力は公式の説明にも表れています。
Spotlight を使うと、アプリ、ファイル、メール、メッセージなど、Mac上のあらゆるものを素早く検索できます。 出典: support.apple.com
mdfind はFinderの検索欄と同じ索引を引きますが、結果がパスの一覧として標準出力に並ぶので、そのまま次のコマンドへ渡せます。大きさで探すなら mdfind "kMDItemFSSize > 1073741824" のように属性名で条件を書きます。ここで返るのは索引に入っているものだけなので、何も返らなかったときは「無い」ではなく「索引に入っていない」可能性を先に疑います。
探す時間ではなく、窓を切り替える回数が効いている
findの書き方を覚えても、作業全体の時間が期待どおりに縮まないことがあります。手が止まっている場所が、コマンドを組み立てる工程ではなく、その前後にあるためです。
実際の流れはこうなります。Finderで見当たらないのでターミナルへ切り替える。findを打って結果のパスが並ぶ。そのパスをコピーしてFinderへ戻り、場所を目で確かめる。中身を確認するためにプレビューを開く。どう処理するかをAIに相談するため、また別の窓へ移る。1回の探索で窓の切り替えが4回以上入る計算になります。
1回あたりは数秒でも、探す作業は1日に何度も起きます。縮める余地が大きいのは、コマンドの書き方より切り替えの回数のほうです。フォルダとターミナルとAIが同じ窓にある状態にすると、結果のパスをコピーして貼り直す工程そのものが消えます。この構成で何ができるようになるかはできることに、Finderや他のファイル管理との違いの整理は他のファイル管理との比較にまとめてあります。
まず変えるとよいのは2点です。ひとつは、名前で探すときの既定を -iname と -maxdepth の組にして、打つ前に範囲を決める癖を付けること。もうひとつは、Finderで出てこなかった理由を索引の有無で先に切り分けることです。この2つが決まっていれば、条件の細かい書き方は man find を引きながら足していけます。手元で整理した状態を移動中に確認したい場合の考え方はiPhone・iPadから続きをに置いてあります。
よくある質問
findで探すと時間がかかります。速くする方法はありますか?
起点を絞ることが最も効きます。~ やルートから探すのをやめ、当たりの付いているフォルダを起点にし、-maxdepth 3 のように降りる段数を決めます。巨大なディレクトリは -prune で中へ降りるのを止め、-xdev で別のボリュームへ行かないようにします。それでも遅いなら、索引を引く mdfind に切り替える判断をします。
Finderの検索では出てこないのにfindでは見つかるのはなぜですか?
Finderの検索欄はSpotlightの索引を引き、findはディレクトリを直接歩くためです。索引を切ったボリューム、開発用のディレクトリ、外付けディスクの中身は索引に入っていないことがあり、その場合Finderからは存在しないものとして扱われます。mdutil -s / でそのボリュームの索引が有効かを確かめると、どちらが原因か切り分けられます。
他のサイトで見た `-printf` を書くとエラーになります?
macOSのfindはBSD系の実装で、-printf を持っていません。GNU系のfindを前提にした記事の書き方は、そのままでは通らないことがあります。出力の形を変えたいときは -exec stat -f "%z %N" {} + のように外部のコマンドへ渡す形に書き換えます。手元で何が使えるかは man find で確認できます。
ファイル名に空白や日本語が入っていると結果がおかしくなります?
パイプで次のコマンドへ渡すときに、行を空白で区切る既定の動きで名前が割れています。find ... -print0 | xargs -0 コマンド の組にすると、区切りが空白ではなくヌル文字になるので割れません。-exec コマンド {} + の形でも同じ問題を避けられます。日本語のファイル名は空白が入りやすいので、この形を既定にしておくと安全です。