Linux の find コマンド は、指定したディレクトリ配下から条件に合致するファイルやディレクトリを検索するためのコマンドです。
ファイル名だけでなく、ファイルの種類・更新日時・サイズ・所有者・パーミッションなど、さまざまな条件を組み合わせて検索できるのが特徴です。
サーバ運用では、ログや設定ファイル、不要になったバックアップファイルの検索など、「とりあえず find」というくらい登場頻度が高いコマンドです。
さらに -exec オプションと組み合わせることで、検索結果に対して一括削除や一括処理を行うこともできます(誤操作には要注意です)。
find 検索開始ディレクトリ [検索条件] [アクション]
最も基本的な形式は次のようになります。
- 検索開始ディレクトリ:どこから検索を始めるか(例:
/var/log、.など) - 検索条件:
-nameや-type、-mtimeなどの条件を指定 - アクション:該当ファイルに対して何をするか(
-print、-delete、-execなど)
検索条件を省略した場合、指定したディレクトリ配下のすべてのファイルやディレクトリのパスが表示されます。
・カレントディレクトリ配下のすべてのファイル・ディレクトリを一覧表示する。
find .
検索条件を付けない場合、.(カレントディレクトリ)配下のすべてのパスを再帰的に表示します。
単純な一覧が欲しいだけであれば、find . -print と書いても同じ意味です。
・特定のファイル名に一致するファイルを探す。
find /var/log -name "access.log"
/var/log 配下から、名前が access.log に一致するファイルを検索します。
-name は大文字小文字を区別するので、ケースを無視したい場合は -iname を使います。
・拡張子が .log のファイルをすべて探す。
find /var/log -name "*.log"
ワイルドカード(*)を使って、.log で終わるファイルを検索します。
シェルによる展開を避けたい場合は、"*.log" のようにダブルクォートで囲むのが安全です。
・ファイルだけに絞って検索する。
find /var/www -type f -name "*.php"
-type f を付けることで、通常ファイルだけを対象に検索します。
ディレクトリやシンボリックリンクを除外したい場合に使います。
・ディレクトリだけを検索する。
find /var/www -type d -maxdepth 2
-type d はディレクトリだけを対象に検索します。
-maxdepth 2 を指定すると、検索の深さを 2 階層までに制限できます。
・直近 1 日以内に更新されたファイルを探す。
find /var/log -mtime -1 -type f
-mtime は最終更新からの日数を指定する条件です。
-1 は「1 日より新しい」を意味し、直近 1 日以内に更新されたファイルを検索します。
・30 日以上前に更新されたファイルを探す。
find /var/log -mtime +30 -type f
+30 は「30 日より古い」を意味します。
古いログファイルを削除したり、別ディスクに退避するときの候補を探すのに便利です。
・サイズが 100MB を超える大きなファイルを探す。
find / -type f -size +100M
-size では、+100M のように単位付きでサイズ条件を指定できます。
ディスクが逼迫しているときに、巨大ファイルを見つける用途でよく使います。
・所有者が特定ユーザーのファイルを探す。
find /home -user www-data -type f
-user で所有者ユーザーを指定できます。
どのユーザーのファイルが容量を使っているかを調べるときに役立ちます。
・権限が 600 のファイルを探す。
find /etc -type f -perm 600
-perm はパーミッション(モード)を条件に検索します。
特定の権限設定になっている設定ファイルや鍵ファイルを探したい場合に使えます。
・空のファイルや空ディレクトリを探す。
find /var/tmp -empty
-empty は、サイズ 0 のファイルや、中身が空のディレクトリを検索します。
一時ディレクトリの整理などに使えます。
・見つかったファイルを削除する(要注意)。
find /var/log -name "*.log" -mtime +30 -type f -delete
-delete アクションを指定すると、条件に合致したファイルをその場で削除します。
誤って重要なファイルを消してしまわないために、
まずは -delete を -print に置き換えて、対象が正しいか確認してから実行するのがおすすめです。
・見つかったファイルに対してコマンドを実行する(-exec)。
find /var/log -name "*.log" -mtime +30 -type f -exec gzip {} \;
-exec コマンド {} \; の形で指定すると、見つかったファイルごとにコマンドを実行できます。
この例では、30 日より古い .log ファイルを順に gzip で圧縮しています。
{} には見つかったファイル名が入り、\; は -exec の終端を表します。
・xargs と組み合わせて高速に処理する。
find /var/log -name "*.log" -mtime +30 -type f -print0 | xargs -0 rm
大量のファイルに対して何らかの処理(削除など)を行う場合、
-print0 と xargs -0 を組み合わせると、スペースや改行を含むファイル名も安全に扱えます。
ただし、本番環境での一括削除は十分な確認のうえで行ってください。
・不要なログやバックアップファイルの整理
/var/log やバックアップディレクトリに対して、-mtime や -size を組み合わせて古いファイルや巨大ファイルを検索し、
容量逼迫の原因となっているファイルを特定・削除する用途でよく使われます。
・設定ファイルやスクリプトの所在確認
アプリケーションの設定ファイルがどこにあるか分からないとき、
find / -name "httpd.conf" 2>/dev/null のようにして場所を検索するのは定番テクニックです。
・パーミッションや所有者のチェック
鍵ファイルや設定ファイルのパーミッションが適切かどうかを、
-perm や -user と組み合わせて機械的にチェックする用途もあります。
・リリースディレクトリの構成確認
Web アプリケーションのリリースディレクトリに対して、
特定の拡張子のファイルだけを一覧化したり、-type d でディレクトリ構成を確認したりする場面でも find は活躍します。
| short option | long option | description |
|---|---|---|
| -name | ファイル名のパターンに一致するものを検索する(大文字小文字は区別される) | |
| -iname | ファイル名のパターンに一致するものを検索する(大文字小文字を区別しない) | |
| -type | ファイルの種類を指定して検索する(f:ファイル d:ディレクトリ l:シンボリックリンク など) | |
| -path | パス全体のパターンに一致するものを検索する | |
| -maxdepth | 検索するディレクトリの深さの上限を指定する(例: -maxdepth 2) | |
| -mindepth | 検索するディレクトリの深さの下限を指定する(例: -mindepth 1) | |
| -mtime | 最終更新日時が指定した日数条件に合うファイルを検索する(+n:より古い -n:より新しい) | |
| -mmin | 最終更新時刻を分単位で指定して検索する | |
| -atime | 最終アクセス日時が指定した日数条件に合うファイルを検索する | |
| -size | ファイルサイズを条件に検索する(例: -size +100M -size -10k) | |
| -user | 指定したユーザーが所有者になっているファイルを検索する | |
| -group | 指定したグループが所有者になっているファイルを検索する | |
| -perm | 指定したパーミッション(モード)を持つファイルを検索する | |
| -empty | サイズ 0 のファイルや空ディレクトリを検索する | |
| -newer | 指定したファイルより新しい更新日時を持つファイルを検索する | |
| 検索結果を標準出力に表示する(デフォルトのアクション) | ||
| -delete | 条件に一致したファイルを削除する(誤操作に注意) | |
| -exec | 条件に一致した各ファイルに対して指定したコマンドを実行する({} にファイル名が入る) | |
| -ok | -exec と同様だが各コマンド実行前に確認プロンプトを表示する | |
| -prune | 指定したディレクトリ以下を検索対象から除外する | |
| -print0 | 検索結果をヌル文字区切りで出力する(xargs -0 などと組み合わせて安全に扱う) | |
| --help | find コマンドの使い方(ヘルプ)を表示して終了する | |
| --version | find コマンドのバージョン情報を表示して終了する |
find コマンドはオプションや検索条件が非常に豊富です。
ここでは、日常的に使うことが多い主な条件とアクションだけを抜粋して表にまとめています。
複雑な条件を組み合わせる場合は、( 条件 ) -a ( 条件 ) のような論理演算も活用できます。
より詳細なオプションや使い方については、Linux の
find(1) マニュアルページ(英語)
などの公式ドキュメントもあわせて参照してください。
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
