技術(非IT系)

findコマンドの再帰的検索とは?使い方と実行方法を解説!(Linux:ディレクトリ:サブディレクトリ:オプション:Unixなど)

当サイトでは記事内に広告を含みます

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システム管理・ファイル操作・自動化タスクの効率が大幅に向上するでしょう。