Linuxで作業していると「このファイルどこにあるんだっけ?」と探す場面はよくあります。
とくにディレクトリ構造が複雑なサーバーやプロジェクトでは、サブディレクトリまで含めて検索しないとファイルを見つけられません。
この記事では、Linuxでサブディレクトリを含めてファイルを検索する方法をわかりやすく紹介します。さらにファイル名だけでなく中身(テキスト)を探す方法まで解説します。
サブディレクトリまで検索するにはfindが便利

findコマンドの基本
find
はディレクトリを再帰的にたどって、条件に合うファイルを探してくれるコマンドです。
まずは基本的な使い方から
カレントディレクトリ以下の全ファイルを表示
find .
.
は「現在のディレクトリ」を意味します。この場合、現在のディレクトリから下のサブディレクトリもすべて検索対象になります。
よく使う検索パターン
ホームディレクトリ以下を検索
find /home/username
システム全体を検索(時間がかかるので注意)
find /
特定の名前で探す
-name
オプションを使うと、ファイル名で検索できます。
具体的な使用例
test.txtを探す
find /path/to/search -name "test.txt"
これで/path/to/search
以下のサブディレクトリも含めてtest.txt
を探します。
大文字小文字を区別しない検索
find /path/to/search -iname "test.txt"
-iname
を使うと、Test.txt
やTEST.TXT
なども見つけてくれます。
ワイルドカードで部分一致
拡張子で検索
拡張子が.logのファイルを全部探す
find /var/log -name "*.log"
複数の拡張子を同時に検索
find /home/user -name "*.txt" -o -name "*.log"
-o
は「または」の意味です。
パターンマッチの活用
特定の文字列を含むファイル名
find /etc -name "*config*"
これで「config」を含むファイル名をすべて見つけます。
数字で終わるファイル
find /var/log -name "*[0-9]"
ファイルタイプで絞り込む
ファイルとディレクトリを区別
ファイルのみを検索
find /home/user -type f -name "*.txt"
ディレクトリのみを検索
find /home/user -type d -name "*backup*"
実際の使用例
例えば、Webサイトのプロジェクト内でPHPファイルを探す場合:
find /var/www/html -type f -name "*.php"
これで、サブディレクトリに分かれたPHPファイルもすべて表示されます。
find
を使えば、サブディレクトリまで含めて柔軟にファイルを探せます。次は、ファイル名だけでなくファイルの中身から文字列を検索する方法を紹介します。
ファイルの中身から文字列を探すにはgrep -r

grep -rで再帰検索
grep
はファイルの中の文字列を検索するコマンドですが、-r
(または--recursive
)をつけるとサブディレクトリまで含めて探せます。
基本的な使い方
ソースコードから「password」を探す
grep -r "password" /home/user/project
これで/home/user/project
以下のすべてのファイルから「password」を含む行を表示します。
検索結果をより見やすくする
行番号も一緒に表示
grep -rn "password" /home/user/project
ファイル名のみを表示
grep -rl "password" /home/user/project
よく使うオプションの組み合わせ
大文字小文字を区別しない検索
grep -ri "error" /var/log
-i
をつけると、「Error」「ERROR」「error」すべてにマッチします。
カラー表示で見やすく
grep -r --color=always "database" /etc
マッチした部分が色付きで表示されるので、結果が見つけやすくなります。
拡張子を絞るには–include
特定のファイルタイプのみを検索
confファイルだけから検索
grep -r --include="*.conf" "listen" /etc
これで/etc
以下の.conf
ファイルだけを対象に検索できます。
複数の拡張子を指定
grep -r --include="*.php" --include="*.html" "mysql" /var/www
除外パターンも便利
特定のディレクトリを除外
grep -r --exclude-dir=".git" --exclude-dir="node_modules" "TODO" /home/user/project
GitリポジトリやNode.jsプロジェクトでよく使うパターンです。
実用的な検索例
設定ファイルからIPアドレスを探す
grep -r --include="*.conf" --include="*.cfg" "192.168" /etc
ログファイルからエラーを探す
grep -ri "error\|warning\|fail" /var/log
複数のキーワードを\|
で区切って同時検索できます。
grep -r
を使えば、サブディレクトリに散らばる設定ファイルやソースコードの中身も一気に探せます。最後にfind
とgrep
を組み合わせた応用例を紹介します。
findとgrepを組み合わせる応用例
まずファイルを絞り込んでから中身を検索
find
で対象ファイルを選び、それをxargs
でgrep
に渡します。
基本的な組み合わせ
PHPファイルの中から「mysql」を探す
find /var/www -name "*.php" | xargs grep "mysql"
この方法なら、まずPHPファイルだけに絞り込んでから検索するので効率的です。
より複雑な条件での検索
24時間以内に更新されたログファイルから「error」を検索
find /var/log -name "*.log" -mtime -1 | xargs grep -i "error"
より安全にするなら-print0とxargs -0
ファイル名に空白や特殊文字が含まれる場合はこうします。
find /var/www -name "*.php" -print0 | xargs -0 grep "mysql"
これならファイル名にスペースがあっても正しく動きます。
なぜ-print0が必要なの?
通常のfindは結果を改行で区切りますが、ファイル名に改行や空白が含まれていると誤動作する可能性があります。
- -print0:結果をnull文字(\0)で区切る
- xargs -0:null文字を区切り文字として処理
実用的な応用例
大きなファイルを除外して検索
find /home/user -name "*.txt" -size -1M -print0 | xargs -0 grep "password"
1MB以下のテキストファイルだけを検索対象にします。
特定の期間に作成されたファイルから検索
find /var/log -name "*.log" -newermt "2024-01-01" ! -newermt "2024-01-31" -print0 | xargs -0 grep "login"
2024年1月に作成されたログファイルからログイン記録を検索します。
権限を考慮した検索
find /etc -readable -name "*.conf" -print0 | xargs -0 grep "database"
読み取り権限があるconfファイルだけを検索対象にします。
execを使った別のアプローチ
xargsの代わりに-exec
を使う方法もあります:
find /var/www -name "*.php" -exec grep -l "mysql" {} \;
- {}:見つかったファイル名が入る
- ;:-execの終了を示す
execとxargsの使い分け
- xargs:大量のファイルを効率的に処理
- -exec:より複雑な処理や確実な動作が必要な場合
find
とgrep
を組み合わせると、数千ファイル規模のプロジェクトでも効率的に目的の情報を探せます。
効率的な検索のコツ

検索範囲を適切に絞る
検索開始位置を工夫する
悪い例:システム全体を検索
find / -name "config.php" # 時間がかかりすぎる
良い例:必要な範囲だけ検索
find /var/www /etc -name "config.php" # 複数パスも指定可能
不要なディレクトリを除外
find /home/user -path "*/node_modules" -prune -o -name "*.js" -print
node_modules
ディレクトリを除外してJavaScriptファイルを検索します。
パフォーマンスを向上させる方法
locateコマンドの活用
# データベースを更新
sudo updatedb
# 高速検索
locate "config.php"
locate
は事前に作成されたデータベースを使うので高速ですが、リアルタイムの情報ではない点に注意が必要です。
findの並列実行
find /var -name "*.log" -print0 | xargs -0 -P 4 grep "error"
-P 4
で4つの並列プロセスを使って検索を高速化できます。
よくあるトラブルと対処法
権限エラーを避ける
find /etc -name "*.conf" 2>/dev/null
権限のないディレクトリでのエラーメッセージを非表示にします。
大量の結果を制御する
find /var/log -name "*.log" | head -20
結果を最初の20件だけに制限します。
まとめ
Linuxでサブディレクトリまでファイルを検索するには、以下のツールと方法を使い分けましょう:
基本的な検索方法
- findでファイル名を検索
- grep -rでファイル中の文字列を検索
- find + xargs grepで高度な絞り込み
効率的な検索のポイント
- 検索範囲を適切に絞る
- 不要なディレクトリは除外する
- ファイルタイプや更新日時も活用する
よく使うパターン
- 設定ファイルの検索:
find /etc -name "*.conf"
- ソースコード内の文字列検索:
grep -r --include="*.php" "function" .
- ログファイルの分析:
find /var/log -name "*.log" -mtime -7
これらを使いこなせば、巨大なディレクトリ構造でも目的のファイルや設定をすぐに見つけることができます。ぜひ日々の運用に役立ててください。
コメント