【Linux】findコマンドでファイルを検索する使い方をLinux中級者向けに解説

Linux

こんにちは、かつコーチです。
「あのログファイル、どのディレクトリに置いたか忘れた」「古いキャッシュファイルをまとめて消したい」。
そんなときに頼りになるのがfindコマンドです。
この記事では、Ubuntu 26.04 LTSでの実例を交えながら、findコマンドの基本から実務でよく使う組み合わせまで解説します。

findコマンドとは?

findコマンドの定義:条件を指定してファイルを探すコマンド

findとは、指定したディレクトリ以下を再帰的にたどり、名前・種類・更新日時などの条件に合うファイルやディレクトリを探し出すコマンドです。

似た用途のコマンドにlocateがありますが、locateはあらかじめ作られたデータベースから検索するため高速な反面、最新のファイルが反映されないことがあります。
findは実際のファイルシステムをその場でたどるため、多少時間はかかりますが常に最新の状態を検索できます。

なぜfindが必要なのか

lscdだけでも目的のファイルを探せなくはありませんが、ディレクトリが深くなったり、ファイル数が増えたりすると現実的ではありません。

findを使うと、以下のようなことがコマンド1つで実現できます。

  • ファイル名の一部やパターンから、どこにあるか分からないファイルを探す
  • 「7日以上更新されていないログ」のように条件でファイルを絞り込む
  • 見つけたファイルに対して、削除やコピーなどの処理をまとめて実行する

つまりfindは「探す」と「処理する」を1つのコマンドでつなげられる点が最大の強みです。

基本の書き方:findコマンドの使い方

手順1:名前でファイルを検索する

最も基本的な使い方は、名前を指定して検索する方法です。

$ find /var/log -name "*.log"
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/syslog.log

find 検索対象のディレクトリ -name "パターン"という形が基本形です。
大文字・小文字を区別せずに検索したい場合は-inameを使います。

$ find /home/katsu -iname "readme*"

手順2:種類(ファイル・ディレクトリ)で絞り込む

-typeオプションを使うと、ファイルかディレクトリかで絞り込めます。

$ find /var/www -type d -name "cache"
$ find /var/www -type f -name "*.php"

-type dはディレクトリ、-type fは通常ファイルを意味します。
ディレクトリだけ、ファイルだけを対象にしたいときによく使います。

手順3:更新日時で絞り込む

-mtime(更新日からの経過日数)を使うと、古いファイルや最近変更されたファイルを探せます。

$ find /var/log -name "*.log" -mtime +7

これは「7日より前に更新されたログファイル」を意味します。
+7は「7日より過去」、-7は「7日以内(未満)」を表す点に注意してください。
時間単位で絞り込みたい場合は-mmin(分単位)も使えます。

$ find /tmp -mmin -30

これは「30分以内に更新されたファイル」を/tmpから探す例です。

つまずきやすい設定・注意点

findは検索対象のディレクトリを省略できません。
また、検索対象より後ろにオプションを書くのが基本ルールで、find -name "*.log" /var/logのように順序を間違えると、意図しない結果になったりエラーになったりします。

$ find -name "*.log" /var/log
find: paths must precede expression: /var/log

このエラーが出たら、ディレクトリとオプションの順序を疑いましょう。

よくあるつまずきポイント・エラー対処

-execで削除するときにファイルを巻き込んでしまう

私が実際に運用中のサーバーでキャッシュファイルを掃除しようとしたとき、-execオプションで一気に削除しようとして、対象範囲を広く取りすぎたことがあります。

❌Before:確認せずいきなり削除を実行してしまう

$ find /var/www/storage/cache -type f -exec rm {} \;

このコマンドはcacheディレクトリ以下の全ファイルを問答無用で削除します。
もし対象ディレクトリの指定を1階層間違えていたら、必要なファイルまで消えてしまうところでした。

✅After:まず-execの代わりに-printや単純な実行結果で対象を目視確認してから削除する

$ find /var/www/storage/cache -type f -name "*.tmp" -mtime +3
$ find /var/www/storage/cache -type f -name "*.tmp" -mtime +3 -exec rm {} \;

先に検索結果だけを表示するコマンドを実行し、対象ファイルの一覧が想定通りか確認してから、同じ条件に-exec rm {} \;を付け足して削除します。
この「まず検索、確認してから実行」の2段階を踏む癖をつけると、削除の事故を大きく減らせます。

権限がないディレクトリでPermission deniedが大量に出る

システム全体を検索しようとすると、権限のないディレクトリでエラーが大量に出ることがあります。

$ find / -name "app.conf"
find: '/root': Permission denied
find: '/proc/1/task': Permission denied

❌Before:エラーメッセージに埋もれて、本来見たい検索結果を見失う

✅After:標準エラー出力を/dev/nullに捨てて、検索結果だけを見る

$ find / -name "app.conf" 2>/dev/null

2>/dev/nullはエラー出力(標準エラー)だけを捨てる書き方です。
標準出力(検索結果)はそのまま表示されるので、ノイズを除いて必要な情報だけを確認できます。

応用・一歩先の使い方

複数条件をandやorで組み合わせる

findは-a(and、省略可)や-o(or)で複数条件を組み合わせられます。

$ find /var/www -type f \( -name "*.log" -o -name "*.tmp" \)

\( \)でグループ化し、-oでorを表現しています。
かっこはシェルに解釈されないよう\でエスケープする点を忘れないようにしましょう。

xargsと組み合わせて処理を効率化する

-execは対象ファイルごとにコマンドを実行するため、ファイル数が多いと遅くなることがあります。
find ... | xargsの形にすると、複数のファイルをまとめてコマンドに渡せるため、処理が速くなるケースが多いです。

$ find /var/log -name "*.log" -mtime +30 -print0 | xargs -0 rm

-print0xargs -0をセットで使うのは、ファイル名にスペースが含まれていても正しく処理するための定番の組み合わせです。

まとめ

この記事のポイント

  • findは名前・種類・更新日時などの条件でファイルを検索するコマンド
  • -name(名前)、-type(種類)、-mtime(更新日時)が基本の3大オプション
  • -execで見つけたファイルに処理をかけられるが、削除前には必ず検索結果を目視確認する
  • 2>/dev/nullでエラー出力を捨てると、権限エラーに埋もれず結果を確認できる
  • 大量ファイルの処理はfind | xargsの組み合わせが定番

次に読むべき記事

findの前提となるパーミッションの仕組みを詳しく知りたい方は「パーミッションの仕組み(rwxとは)」を、実際に見つけたファイルの権限を変更したい方は「chmod・chownでパーミッションを変更する」を合わせてご覧ください。

タグ: Linux, 中級者向け, テキスト処理

タイトルとURLをコピーしました