find – ファイルやディレクトリを検索するコマンド

コマンドリファレンス

find コマンドは、指定したディレクトリ以下を再帰的に探索し、条件に一致するファイルやディレクトリを検索 するコマンドです。
名前、サイズ、更新日時、権限など多様な条件で検索でき、バックアップやログ調査などに広く利用されます。

  1. 構文(Syntax)
  2. 主なオプション・条件一覧
  3. 論理演算と評価式
    1. AND(論理積:-a)
    2. OR(論理和:-o)
    3. NOT(否定:! または -not)
    4. 括弧による条件グループ化
    5. ポイント
  4. 実行例
    1. カレントディレクトリ以下で .log ファイルを検索
    2. 大文字小文字を区別せずに README ファイルを探す
    3. サイズが100MBを超えるファイルを検索
    4. 7日以内に更新されたログを検索
    5. 所有者が alice のファイルを探す
    6. .tmp ファイルを削除
    7. 見つかったログファイルを圧縮
    8. 1階層目のみ検索
    9. エラー例(存在しないディレクトリ)
  5. パフォーマンス最適化と注意点
    1. 検索対象の深さを制御する
    2. 特定ディレクトリを除外する
    3. 実行コマンドの効率化
    4. シェル展開とエスケープの注意
    5. 権限やエラーメッセージの処理
  6. OS環境別の使い方まとめ
    1. GNU/Linux (GNU findutils)
    2. BSD系 (macOS など)
    3. AIX や商用 UNIX
    4. Windows (find / findstr)
    5. まとめ
  7. 関連ツールとの比較
    1. locate
    2. grep
    3. fd
    4. ripgrep (rg)
    5. 使い分けの目安
  8. FAQとよくあるトラブル
    1. Q1. find が「Permission denied」を大量に出力する
    2. Q2. -o(OR条件)が意図した結果を返さない
    3. Q3. 括弧を使った検索で「syntax error」が出る
    4. Q4. ワイルドカードが展開されてしまう
    5. Q5. ファイル削除で「Argument list too long」が出る
    6. Q6. 特定ディレクトリを検索対象から外したい
  9. 備考
  10. まとめと次の学びへのリンク
    1. 次に学ぶと役立つコマンド
    2. 関連記事
  11. 参考
  12. 関連記事

構文(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-ChildItemWhere-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 をきっかけに、これらのコマンドやスクリプトを組み合わせて使いこなせるようになれば、日々の作業を大幅に効率化できます。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント