find コマンドは、指定したディレクトリ以下を再帰的に探索し、条件に一致するファイルやディレクトリを検索 するコマンドです。
名前、サイズ、更新日時、権限など多様な条件で検索でき、バックアップやログ調査などに広く利用されます。
構文(Syntax)
find [PATH...] [条件式] [アクション]
主なオプション・条件一覧
| オプション / 条件 | 説明 | 使用例 |
|---|---|---|
-name PATTERN | ファイル名で検索(ワイルドカード可) | find . -name "*.log" |
-iname PATTERN | 大文字小文字を無視して検索 | find . -iname "readme.txt" |
-type TYPE | 種類を指定(f=ファイル, d=ディレクトリ, l=シンボリックリンク) | find . -type d -name "config" |
-size N | サイズで検索(+N=Nより大きい, -N=Nより小さい, N=ちょうど) | find . -size +100M |
-mtime N | 更新日が N日前(+N=より古い, -N=より新しい) | find /var/log -mtime -7 |
-user USER | 指定ユーザー所有のファイル | find /home -user alice |
-group GROUP | 指定グループ所有のファイル | find /srv -group staff |
-perm MODE | 指定のパーミッション | find . -perm 644 |
-exec CMD {} \; | 検出結果に対してコマンド実行 | find . -name "*.log" -exec rm {} \; |
-exec CMD {} + | まとめてコマンドに渡す | find . -name "*.txt" -exec cat {} + |
-delete | マッチしたファイルを削除 | find . -name "*.tmp" -delete |
-maxdepth N | 探索する階層の深さを制限 | find . -maxdepth 1 -name "*.txt" |
-mindepth N | 指定深さより浅いディレクトリを無視 | find . -mindepth 2 -name "*.conf" |
論理演算と評価式
find コマンドは単純な条件指定だけでなく、複数の条件を組み合わせて柔軟に検索できます。その際に活躍するのが 論理演算子 や 評価式 です。
AND(論理積:-a)
デフォルトで find は複数の条件を AND(かつ) で評価します。
つまり、すべての条件を満たすファイルのみが検索結果に含まれます。
find . -type f -name "*.log" -size +1M
この例では「拡張子が .log かつ サイズが1MBより大きいファイル」を検索します。-a を明示することも可能ですが、省略できます。
OR(論理和:-o)
いずれかの条件を満たす ファイルを検索する場合は -o を使用します。
find . -type f -name "*.log" -o -name "*.txt"
この例では「拡張子が .log または .txt のファイル」を検索します。
ただし注意点として、-o の優先順位は低いため、意図しない結果を避けるために 括弧で条件をまとめる ことが推奨されます。
find . -type f \( -name "*.log" -o -name "*.txt" \)
NOT(否定:! または -not)
特定条件を除外したい場合には NOT 演算子 を使います。
find . -type f ! -name "*.log"
この例では「.log 以外のすべてのファイル」を検索します。
括弧による条件グループ化
条件式をグルーピングする場合は括弧を使います。ただしシェルによる解釈を避けるため、バックスラッシュでエスケープする必要があります。
find . \( -name "*.jpg" -o -name "*.png" \) -size -500k
この例は「拡張子が .jpg または .png かつ サイズが500KB未満のファイル」を検索します。
ポイント
- AND(デフォルト): すべての条件を満たすファイルを検索
- OR(-o): どちらかの条件を満たすファイルを検索
- NOT(! または -not): 特定条件を除外
- 括弧(……): 条件をグループ化して複雑な検索に対応
論理演算を理解して活用すれば、単純な検索から複雑な検索まで対応できるようになります。
実行例
カレントディレクトリ以下で .log ファイルを検索
find . -name "*.log"
大文字小文字を区別せずに README ファイルを探す
find . -iname "readme.txt"
サイズが100MBを超えるファイルを検索
find /var -size +100M
7日以内に更新されたログを検索
find /var/log -mtime -7
所有者が alice のファイルを探す
find /home -user alice
.tmp ファイルを削除
find . -name "*.tmp" -delete
見つかったログファイルを圧縮
find . -name "*.log" -exec gzip {} \;
1階層目のみ検索
find . -maxdepth 1 -type f
エラー例(存在しないディレクトリ)
find /notfound -name "*.txt"
出力例:
find: ‘/notfound’: No such file or directory
パフォーマンス最適化と注意点
find コマンドは強力ですが、大量のファイルを検索する場合には処理が遅くなることがあります。効率的に使うためには、いくつかの最適化オプションや注意点を押さえておくことが重要です。
検索対象の深さを制御する
ディレクトリ階層が深い場合、すべてを探索すると無駄が多くなります。-maxdepth と -mindepth を活用することで、検索範囲を制限できます。
find . -maxdepth 1 -type f
この例はカレントディレクトリ直下のみを検索し、サブディレクトリ以下は無視します。
find . -mindepth 2 -type f
この例は2階層目以降を検索対象とし、直下のファイルは無視します。
特定ディレクトリを除外する
不要なディレクトリを検索から外す場合は -prune を利用します。
find . -path "./node_modules" -prune -o -type f -print
この例では node_modules ディレクトリを除外して検索します。
実行コマンドの効率化
検索結果に対して処理を行う場合、-exec ... {} \; は1ファイルごとに実行されるため非効率です。大量のファイルを扱う際には + を使うことでまとめて処理できます。
find . -type f -name "*.log" -exec rm {} +
または xargs と組み合わせて効率化する方法も有効です。
find . -type f -print0 | xargs -0 rm
シェル展開とエスケープの注意
*.log のようなパターンはシェルによって展開される場合があります。意図した通りに動作させるには、クォートで囲んでシェル展開を防ぐことが大切です。
find . -name "*.log"
権限やエラーメッセージの処理
アクセス権がないディレクトリを検索すると「Permission denied」のエラーが大量に表示されることがあります。これを避けたい場合は標準エラーを捨てるか、ログにリダイレクトします。
find / -type f 2>/dev/null
パフォーマンスを意識した使い方を取り入れることで、find コマンドは大規模な環境でも快適に利用できます。
OS環境別の使い方まとめ
find コマンドは UNIX 系 OS を中心に幅広く使われていますが、環境によって挙動や対応オプションが異なる場合があります。ここでは代表的な環境ごとの違いを整理します。
GNU/Linux (GNU findutils)
最も一般的に利用される環境です。豊富なオプションに対応しており、-regex や -newermt などの便利な拡張が利用可能です。
find . -regex ".*\.\(jpg\|png\)"
正規表現で複数拡張子を一度に検索できるのは GNU find の特徴です。
BSD系 (macOS など)
macOS の find は BSD 系の実装であり、GNU 版と比べると一部オプションが異なります。たとえば -regex の挙動や -newermt が利用できない場合があります。GNU find が必要な場合は Homebrew で findutils をインストールし、gfind として使うのが一般的です。
brew install findutils
gfind . -newermt "2025-01-01"
AIX や商用 UNIX
IBM AIX など商用 UNIX に搭載されている find は、オプションが限定的で GNU 版とは互換性がない場合があります。公式マニュアルで利用可能なオプションを確認しながら使用する必要があります。
Windows (find / findstr)
Windows には同名の find コマンドがありますが、これはテキスト検索用であり Linux の find とは用途が異なります。ファイル探索を行いたい場合は PowerShell の Get-ChildItem や Where-Object を利用します。
Get-ChildItem -Recurse -Filter *.log | Where-Object { $_.Length -gt 1MB }
Windows 環境で UNIX 系の find を使いたい場合は WSL(Windows Subsystem for Linux)や Git Bash を導入するのが現実的です。
まとめ
- GNU/Linux: 最も機能豊富で実用的
- BSD/macOS: 一部機能が制限される、
gfindの導入で補完可能 - AIX/商用 UNIX: オプションの差異に注意
- Windows:
findは別物、代替は PowerShell または WSL
利用環境によって挙動が異なるため、複数環境で作業する場合はオプションの対応状況を事前に確認しておくことが大切です。
関連ツールとの比較
find コマンドは強力ですが、同じようにファイルや文字列を検索するツールは他にも存在します。目的に応じて使い分けることで、より効率的に作業ができます。
locate
locate はファイル名データベースを利用して高速に検索できるコマンドです。find のようにリアルタイムでファイルシステムを探索するのではなく、あらかじめ作成されたデータベースから検索するため非常に速いのが特徴です。ただし、最新のファイルはデータベース更新 (updatedb) を行うまで反映されません。
locate error.log
grep
grep はファイルの中身を検索するためのコマンドです。ファイルの有無を調べる find と組み合わせることで、特定条件にマッチするファイルを素早く見つけられます。
find . -type f -name "*.log" | xargs grep "ERROR"
fd
fd はモダンな find の代替ツールとして人気です。シンプルな構文で、デフォルトでカラー表示や正規表現検索に対応しており、使いやすさと速度が大きな魅力です。
fd error --extension log
ripgrep (rg)
ripgrep はファイル内容を高速に検索できるコマンドで、grep よりも圧倒的に速く、.gitignore を考慮して不要なファイルを除外してくれます。ソースコード検索に適しています。
rg "TODO"
使い分けの目安
- ファイル名の検索:
find,locate,fd - ファイル内容の検索:
grep,ripgrep - 高速検索を重視:
locate(ファイル名)、ripgrep(内容検索) - シンプルさを重視:
fd
find は柔軟性と正確性に優れていますが、状況に応じて他のツールを使い分けると作業効率が格段に上がります。
FAQとよくあるトラブル
find コマンドは便利ですが、使い始めのうちは思わぬ動作やエラーに遭遇することがあります。ここではよくある疑問やトラブルと、その解決方法をまとめます。
Q1. find が「Permission denied」を大量に出力する
システム全体を検索すると、権限のないディレクトリにアクセスしようとしてエラーが表示されることがあります。不要なエラーメッセージは標準エラー出力をリダイレクトすることで抑制できます。
find / -type f 2>/dev/null
Q2. -o(OR条件)が意図した結果を返さない
OR 条件は優先順位が低いため、意図せず全体に適用されてしまうことがあります。必ず括弧でグループ化するようにしましょう。
# NG(意図しない結果)
find . -type f -name "*.log" -o -name "*.txt"
# OK(括弧でグループ化)
find . -type f \( -name "*.log" -o -name "*.txt" \)
Q3. 括弧を使った検索で「syntax error」が出る
シェルによって括弧が解釈されてしまうため、\( \) のようにバックスラッシュでエスケープする必要があります。
find . \( -name "*.jpg" -o -name "*.png" \)
Q4. ワイルドカードが展開されてしまう
*.log のようなパターンは、シェルによって展開される可能性があります。必ずクォートで囲んで使うのが安全です。
find . -name "*.log"
Q5. ファイル削除で「Argument list too long」が出る
大量のファイルに対して処理を行う場合、引数の制限に引っかかることがあります。-exec ... + や xargs を使えば回避できます。
# 推奨
find . -name "*.log" -exec rm {} +
Q6. 特定ディレクトリを検索対象から外したい
-prune オプションを使うと特定ディレクトリを除外できます。
find . -path "./node_modules" -prune -o -type f -print
備考
findはリアルタイムにディレクトリを探索するため、locateより遅いが最新の情報を取得できる。-execを使うときは;の前にバックスラッシュ(\;) が必要。- 誤操作防止のため、削除系のコマンド実行前に
-printで結果を確認することを推奨。
まとめと次の学びへのリンク
find コマンドは、システム管理から日常的なファイル整理まで幅広く活用できる強力なツールです。基本構文に加えて、論理演算や評価式、パフォーマンスを意識した使い方を習得することで、複雑な検索条件にも柔軟に対応できるようになります。
また、環境ごとの違いや関連ツールとの使い分けを理解しておくと、作業効率はさらに高まります。特に大規模なシステムを扱う場合や複数 OS を行き来する場合には、この知識が大きな武器となるでしょう。
次に学ぶと役立つコマンド
- grep: ファイル内容の検索に特化
- locate: データベースを使った高速ファイル検索
- fd / ripgrep: モダンで高速な代替ツール
- xargs:
findと組み合わせて大量のファイルを効率的に処理
関連記事
find をきっかけに、これらのコマンドやスクリプトを組み合わせて使いこなせるようになれば、日々の作業を大幅に効率化できます。
参考
- manページ: man7.org find(1)
- GNU findutils: https://www.gnu.org/software/findutils/

コメント