LinuxやUnixシステムでファイルを検索する際に最もよく使われるコマンドが「find」です。
findコマンドは指定したディレクトリ以下のすべてのサブディレクトリを再帰的に探索してファイルやディレクトリを検索できる強力なコマンドです。
本記事では、findコマンドの基本構文・再帰的検索の仕組み・よく使うオプションと具体的な実行例・応用的な使い方まで、Linux初学者にもわかりやすく解説します。
findコマンドをマスターすることで、ファイル管理・システム管理・シェルスクリプトの効率が格段に向上するでしょう。
findコマンドとは何か?基本構文と再帰的検索の仕組み
それではまず、findコマンドの基本構文と再帰的検索の仕組みについて解説していきます。
findコマンドは指定したディレクトリを起点として、その配下のすべてのサブディレクトリを再帰的にたどりながらファイル・ディレクトリを検索するLinux/Unixコマンドです。
findコマンドの基本構文:
find [検索開始パス] [オプション] [条件] [アクション]
例:find /home -name “*.txt”
→ /home以下のすべてのディレクトリを再帰的に検索し、.txtで終わるファイルをすべて表示する
「再帰的検索」とは、最初に指定したディレクトリの中のサブディレクトリを探索し、さらにそのサブディレクトリの中のサブディレクトリを探索し……という処理を、最深部まで繰り返すことです。
findコマンドはデフォルトで再帰的検索を行うため、特別なオプションなしに指定パス以下の全階層を検索します。
findコマンドの主要オプション一覧
| オプション | 意味 | 使用例 |
|---|---|---|
| -name | ファイル名(パターン)で検索 | find . -name “*.log” |
| -type | 種別(f:ファイル, d:ディレクトリ) | find . -type f |
| -mtime | 更新日時(日数)で検索 | find . -mtime -7(7日以内) |
| -size | ファイルサイズで検索 | find . -size +1M(1MB超) |
| -maxdepth | 探索の最大深さ | find . -maxdepth 2 |
| -exec | 見つかったファイルにコマンド実行 | find . -name “*.txt” -exec cat {} \; |
-maxdepthで再帰の深さを制限する
デフォルトのfindは無制限に再帰的検索を行いますが、-maxdepthオプションで探索する最大ディレクトリ階層を制限できます。
-maxdepthの使用例:
find . -maxdepth 1 -name “*.txt”
→ カレントディレクトリ直下のみを検索(サブディレクトリは探索しない)
find . -maxdepth 2 -type d
→ 2階層までのディレクトリ一覧を表示
findコマンドの実践的な使い方
続いては、findコマンドの実践的な使い方と具体的なコマンド例を確認していきます。
ファイル名・拡張子での検索
ファイル名・拡張子での検索例:
# .txtファイルをすべて検索
find /home/user -name “*.txt”
# 大文字小文字を区別しない検索
find . -iname “readme*”
# 特定のファイル名完全一致
find / -name “httpd.conf” 2>/dev/null
(2>/dev/nullで権限エラーを非表示にする)
「2>/dev/null」はエラー出力を/dev/null(捨て場)にリダイレクトするテクニックであり、アクセス権限エラーで検索結果が見にくくなるのを防ぎます。
更新日時・サイズでの検索
更新日時・サイズでの検索例:
# 7日以内に更新されたファイルを検索
find . -mtime -7
# 30日より前に更新されたログファイルを検索
find /var/log -name “*.log” -mtime +30
# 100MB超のファイルを検索
find / -size +100M -type f 2>/dev/null
# 空ファイル(0バイト)を検索
find . -empty -type f
-execで検索結果に対してコマンドを実行する
findの強力な機能のひとつが「-exec」オプションです。
検索で見つかったファイルに対して、そのまま任意のコマンドを実行できます。
-execの使用例:
# 見つかった.tmpファイルをすべて削除
find . -name “*.tmp” -exec rm {} \;
# 見つかった.txtファイルの内容を表示
find . -name “*.txt” -exec cat {} \;
# 見つかったファイルの権限を変更
find . -name “*.sh” -exec chmod +x {} \;
({}は見つかったファイル名に展開される、\;はコマンドの終端を示す)
findコマンドの応用と組み合わせ技
続いては、findコマンドの応用的な使い方と他のコマンドとの組み合わせを確認していきます。
findとgrepの組み合わせ
findで見つかったファイルの内容をgrepで検索するという組み合わせは非常によく使われます。
find + grepの組み合わせ:
# .pyファイルの中で”import os”という行を含むものを検索
find . -name “*.py” -exec grep -l “import os” {} \;
# またはxargsを使う方法(高速)
find . -name “*.py” | xargs grep -l “import os”
findとxargsの組み合わせ
「xargs」コマンドはfindの結果を別コマンドの引数として渡す際に使われます。
-execより大量ファイルを一括処理する際にxargsのほうが高速です。
xargsとの組み合わせ例:
# 見つかったファイル名に空白が含まれる場合の安全な書き方
find . -name “*.txt” -print0 | xargs -0 rm
(-print0と-0でファイル名の空白・特殊文字を安全に処理)
findコマンドを使ったシェルスクリプトの例
findコマンドはシェルスクリプトの中で強力なファイル管理ツールとして活用されます。
30日以上前のログファイルを削除するスクリプト例:
#!/bin/bash
find /var/log/myapp -name “*.log” -mtime +30 -exec rm -f {} \;
echo “古いログファイルを削除しました”
cron(定期実行)と組み合わせることで、古いファイルの自動削除・バックアップ・ファイル整理を自動化できます。
まとめ
findコマンドは指定ディレクトリ以下のサブディレクトリを再帰的に探索し、ファイル名・種別・更新日時・サイズなどの条件でファイルを検索するLinux/Unixの強力なツールです。
-nameで名前・-typeで種別・-mtimeで日時・-sizeでサイズを絞り込み、-execやxargsと組み合わせることで検索結果に対する一括処理が可能になります。
-maxdepthで再帰の深さを制御し、2>/dev/nullでエラー出力を抑制するテクニックも実務では重要です。
findコマンドをgrepやxargsと組み合わせてシェルスクリプトに活用することで、Linuxシステム管理・ファイル操作・自動化タスクの効率が大幅に向上するでしょう。