findコマンド入門と応用|ファイル検索・条件絞り込み・高速化の方法

未分類

Linux や Unix 系 OS で作業していると、「あのファイルどこにあったっけ?」という場面は日常茶飯事です。
そんなときに活躍するのが find コマンド。名前の通り、ファイルやディレクトリを検索するための強力なツールです。

find は単にファイル名で探すだけでなく、

  • 更新日時
  • サイズ
  • 種類(ファイル / ディレクトリ / シンボリックリンク)
  • パーミッション
    といった条件を自由に組み合わせて検索できます。さらに、検索結果に対して削除・コピー・文字列検索などの処理を直接実行することも可能です。

しかし、オプションが多く複雑に見えるため、初心者はつまずきやすく、慣れたユーザーでも効率的な使い方や安全な実行方法を知らないことがあります。

この記事では、

  1. 基本の使い方(入門編)
  2. 業務で役立つ応用例(中級編)
  3. 高速化・トラブル対策(上級編)
    を段階的に解説します。最後には、目的別にすぐ使えるコマンド早見表も用意しました。

このページを開いている間に、あなたも find コマンドを自在に使いこなせるようになります。

  1. findコマンドとは?
    1. locateやgrepとの比較
  2. 基本構文とオプション
    1. よく使う主なオプション
  3. 目的別の使い方(コピペできる例付き)
    1. 名前で探す
    2. 大文字小文字を区別せず探す
    3. 拡張子で探す
    4. 日付や更新時間で探す
    5. サイズで探す
    6. 空ファイル・空ディレクトリを探す
    7. 特定のパーミッションを持つファイルを探す
    8. 深さを制限して探す
  4. 実務で役立つ応用例
    1. 複数条件で探す(AND / OR)
    2. 検索結果に対して処理を実行する(-exec)
    3. xargsとの組み合わせ
    4. grepと組み合わせて内容検索
    5. findで安全に削除する(-okや確認付き)
  5. 高速化・効率化のテクニック
    1. 検索開始ディレクトリを限定する
    2. 検索の深さを制限する(-maxdepth / -mindepth)
    3. -exec … + で処理回数を減らす
    4. -print0 と xargs -0 の活用
    5. 不要なエラーメッセージを抑制する
  6. トラブルシューティング
    1. Permission denied が大量に出る
    2. スペース・改行・日本語を含むファイル名で失敗する
    3. -exec が遅い/「Argument list too long」
    4. ネットワーク領域や仮想FSを走査して激遅
    5. 期待した拡張子にマッチしない
    6. 時間指定がズレる(-mtime と -mmin の違い)
    7. サイズ指定が思った通りに効かない
    8. ディレクトリが深すぎてノイズが多い
    9. シンボリックリンクでループする/余計な場所まで辿る
    10. grep 連携でバイナリに当たってうるさい
    11. 思わぬ削除事故が怖い
  7. よく使うfindコマンド早見表
  8. まとめ
  9. 関連記事

findコマンドとは?

find コマンドは、指定したディレクトリ階層から条件に一致するファイルやディレクトリを検索するためのコマンドです。

検索対象の名前や種類、サイズ、更新日時、パーミッションなど、さまざまな条件を組み合わせて絞り込みができます。さらに、検索結果に対して削除やコピー、文字列検索などのアクションを直接実行することも可能です。

locateやgrepとの比較

他の検索コマンドと比べると、find は検索範囲をディレクトリ単位で細かく指定でき、条件式も柔軟に構築できる点が特徴です。

例えば locate コマンドはインデックスを使って高速に検索しますが、最新のファイル構成を反映するにはデータベース更新が必要です。

一方 grep はファイル内容の検索に特化していますが、ファイル名や属性を条件に探すことはできません。

find はこれらとは異なり、ファイルシステムを直接走査して条件に合致する項目を探し出せるため、環境や用途を問わず幅広く利用されています。

基本構文とオプション

find コマンドの基本的な構文は以下の通りです。

find [検索開始ディレクトリ] [検索条件] [アクション]
  • 検索開始ディレクトリ
    検索を始める場所を指定します。. は現在のディレクトリ、/ はルートディレクトリを意味します。複数ディレクトリを並べて指定することも可能です。
  • 検索条件
    ファイル名、種類、サイズ、更新日時、パーミッションなど、検索対象を絞り込むためのオプションです。複数条件を組み合わせることもできます。
  • アクション
    検索結果に対して実行する処理を指定します。標準出力に結果を表示する -print(省略時のデフォルト)や、削除・コピー・内容検索などが可能です。

よく使う主なオプション

オプション説明使用例
-name "パターン"ファイル名がパターンに一致するものを検索(大文字小文字区別あり)find . -name "*.txt"
-iname "パターン"大文字小文字を区別せず検索find . -iname "*.jpg"
-type f / -type dファイル(f)、ディレクトリ(d)など種類を指定find /var -type d
-size [+/-]サイズ指定サイズより大きい(+)または小さい(-)ものを検索。単位は c(バイト)、k(KB)、M(MB)などfind . -size +10M
-mtime 日数最終更新日が指定日数前のファイルを検索find . -mtime -7
-maxdepth N検索するディレクトリ階層の深さを制限find . -maxdepth 2 -name "*.log"
-mindepth N指定階層以上から検索を開始find . -mindepth 2 -type f
-exec コマンド {} \;検索結果に対して任意のコマンドを実行find . -name "*.tmp" -exec rm {} \;

オプションは組み合わせて使うことができ、条件を増やすことで効率的に目的のファイルを探し出せます。

目的別の使い方(コピペできる例付き)

ここでは、日常的によく使う検索目的ごとに find コマンドの例を紹介します。すべてコピペしてすぐに試せる形式になっています。


名前で探す

ファイル名が完全一致するものを探します(大文字小文字区別あり)。

find . -name "sample.txt"

大文字小文字を区別せず探す

拡張子やファイル名の大文字小文字を無視して検索します。

find . -iname "*.jpg"

拡張子で探す

指定した拡張子を持つファイルをすべて探します。

find /var/www -name "*.php"

日付や更新時間で探す

最終更新日が7日以内のファイルを検索します。

find . -mtime -7

サイズで探す

10MBより大きいファイルを検索します。

find . -size +10M

空ファイル・空ディレクトリを探す

中身がないファイルやディレクトリを検索します。

find . -empty

特定のパーミッションを持つファイルを探す

実行権限が付いているファイルを検索します。

find . -type f -perm /111

深さを制限して探す

現在のディレクトリから2階層以内を検索します。

find . -maxdepth 2 -name "*.log"

複数の条件は組み合わせることができ、-and-or、括弧 () を使うことでさらに絞り込みが可能です。

実務で役立つ応用例

業務や日常の作業では、単純な検索だけでなく、検索結果に対して処理を加えたり、複雑な条件で絞り込みたい場面が多くあります。ここでは、実務で特に役立つ応用的な find コマンドの使い方を紹介します。


複数条件で探す(AND / OR)

更新7日以内かつ .log ファイルのみを検索します。

find . -name "*.log" -mtime -7

.log または .txt のどちらかに一致するファイルを検索します。

find . \( -name "*.log" -o -name "*.txt" \)

検索結果に対して処理を実行する(-exec)

検索した .tmp ファイルを削除します。

find . -name "*.tmp" -exec rm {} \;

-exec の末尾を + にすると、まとめてコマンドに渡すため高速化できます。

find . -name "*.tmp" -exec rm {} +

xargsとの組み合わせ

-print0xargs -0 を組み合わせると、スペースや特殊文字を含むファイル名も安全に処理できます。以下は .log ファイルを一括で圧縮する例です。

find . -name "*.log" -print0 | xargs -0 tar -czf logs.tar.gz

grepと組み合わせて内容検索

.php ファイルの中から「password」という文字列を含むものを探します。

find . -name "*.php" -exec grep -l "password" {} \;

findで安全に削除する(-okや確認付き)

削除前に確認を取りながら .bak ファイルを削除します。

find . -name "*.bak" -ok rm {} \;

これらの方法を活用すれば、find コマンドは単なる検索ツールから、業務効率を大きく向上させる強力なスクリプト部品として使えるようになります。

高速化・効率化のテクニック

find コマンドは柔軟で強力ですが、対象ディレクトリや条件によっては検索に時間がかかることがあります。ここでは、検索を高速化し、無駄な処理を省くための実践的な方法を紹介します。


検索開始ディレクトリを限定する

ルートディレクトリ / から検索すると全ファイルを走査するため非常に時間がかかります。必要な範囲だけを指定することで大幅な高速化が可能です。

find /var/log -name "*.log"

検索の深さを制限する(-maxdepth / -mindepth)

  • -maxdepth N : 指定した階層までを検索
  • -mindepth N : 指定した階層から検索開始

例:2階層以内にある .conf ファイルを探す

find /etc -maxdepth 2 -name "*.conf"

-exec … + で処理回数を減らす

-exec の末尾を ; から + に変えると、複数の検索結果をまとめて1回のコマンドに渡すため、プロセス起動の回数が減り高速化できます。

find . -name "*.tmp" -exec rm {} +

-print0 と xargs -0 の活用

-print0 は検索結果をヌル文字区切りで出力するため、スペースや特殊文字を含むファイル名も安全に処理できます。xargs -0 と組み合わせれば、大量のファイルを一括処理できます。

find . -type f -print0 | xargs -0 wc -l

不要なエラーメッセージを抑制する

権限がないディレクトリを走査すると Permission denied が大量に出力されます。2>/dev/null で標準エラー出力を捨てれば、処理速度が向上することもあります。

find / -name "*.log" 2>/dev/null

これらのテクニックを組み合わせれば、find コマンドをより効率的かつ快適に活用できます。

トラブルシューティング

Permission denied が大量に出る

権限のないディレクトリを走査している可能性があります。標準エラーを捨てるか、必要な範囲だけに絞ります。

find / -name "*.log" 2>/dev/null
find /var/log -name "*.log"

sudo が必要な場面では実行ユーザーを見直してください。


スペース・改行・日本語を含むファイル名で失敗する

xargs などにそのまま渡すと壊れます。-print0xargs -0 を必ずセットで。

find . -type f -name "*.txt" -print0 | xargs -0 wc -l

-exec が遅い/「Argument list too long」

1件ずつコマンドが起動されると遅く、引数が多すぎると失敗します。末尾を \; ではなく + に。

find . -name "*.tmp" -exec rm {} +

ネットワーク領域や仮想FSを走査して激遅

NFS、/proc/sys などを避けるか、ファイルシステムを跨がない設定にします。

find / -xdev -name "*.conf" 2>/dev/null
find / -path /proc -prune -o -path /sys -prune -o -name "*.conf" -print

期待した拡張子にマッチしない

シェルに展開されないよう 必ずクォート-name はワイルドカード(glob)で、正規表現ではありません。

find . -name "*.jpg"      # OK(必ず " を付ける)
find . -regex '.*\.jpg'   # 正規表現で探す例

時間指定がズレる(-mtime と -mmin の違い)

-mtime は「日単位(24時間ブロック)」、分単位は -mmin

find . -mtime -1      # 過去24時間以内ではない場合あり
find . -mmin -60      # 過去60分以内

サイズ指定が思った通りに効かない

単位の指定ミスが定番。c(バイト), k, M, G を明示します。

find . -size +10M
find . -size -1024c

ディレクトリが深すぎてノイズが多い

深さを制限して必要な範囲だけを検索。

find . -maxdepth 2 -name "*.log"

シンボリックリンクでループする/余計な場所まで辿る

リンク追跡は基本オフ。特別な理由がない限り -L は使わず、辿りたくないパスを -prune

find . -path "./vendor" -prune -o -name "*.php" -print

grep 連携でバイナリに当たってうるさい

対象をファイルに限定し、grep は一致したファイル名だけ出す -l

find . -type f -name "*.php" -exec grep -l "password" {} \;

思わぬ削除事故が怖い

まずは -print で結果確認 → -ok で対話削除 → 慣れてから -exec rm

find . -name "*.bak" -print
find . -name "*.bak" -ok rm {} \;

よく使うfindコマンド早見表

目的コマンド例補足
名前で探す(完全一致)find . -name "sample.txt"大文字小文字は区別される
名前で探す(大文字小文字区別なし)find . -iname "*.jpg".JPG.Jpg も一致
拡張子で探すfind /var/www -name "*.php"特定の種類のファイル検索
複数拡張子を探すfind . \( -name "*.log" -o -name "*.txt" \)括弧は \( \) でエスケープ
ファイルタイプ指定find . -type df=ファイル、d=ディレクトリ
サイズで探すfind . -size +10M+はより大きい、-はより小さい
更新7日以内find . -mtime -7分単位なら -mmin
空ファイル・空ディレクトリfind . -empty削除は -exec rm {} \;
深さ制限find . -maxdepth 2 -name "*.log"階層を制限して検索
権限指定で探すfind . -perm /111実行権限のあるファイル
検索結果を削除find . -name "*.tmp" -exec rm {} \;-ok にすれば確認付き
複数ファイルをまとめて削除find . -name "*.tmp" -exec rm {} +高速化できる
grepと組み合わせfind . -name "*.php" -exec grep -l "keyword" {} \;内容検索に活用
スペースや特殊文字に対応`find . -type f -print0xargs -0 wc -l`
権限エラー回避find / -name "*.log" 2>/dev/null権限のないディレクトリを除外
FS跨ぎ防止find / -xdev -name "*.conf"別ファイルシステムを除外

この早見表を参考にすれば、日常的な find コマンドの用途はほぼカバーできます。条件を組み合わせればさらに柔軟な検索が可能です。

まとめ

find コマンドは、単なるファイル検索ツールにとどまらず、条件指定・処理実行・他コマンドとの連携までこなせる非常に強力なユーティリティです。
基本的なオプションを理解し、目的別の使い方や応用例、トラブルシューティングを押さえておけば、日常業務から大規模なシステム管理まで幅広く対応できます。

  • 基本構文と主要オプションを押さえれば、すぐに実務で使える
  • 複数条件やアクション実行で検索+処理を一度に行える
  • 高速化・安全対策を取り入れることで、効率と信頼性が向上する

今回紹介したコマンド例や早見表を手元に置き、必要に応じて組み合わせて活用すれば、ファイル探索の時間は大幅に短縮できます。
find を使いこなすことは、Linux 作業全体の効率化につながる大きな武器になります。

Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント