概要
システム内に存在する膨大なファイルの中から、ファイル名、更新日時、サイズ、権限、所有者など、あらゆる条件を組み合わせてファイルを検索する強力なコマンドです。
単に場所を探すだけでなく、検索したファイルに対して「削除する」「移動する」「権限を変える」といったアクションを一括で実行できるため、サーバー管理やログローテーション、不要ファイルの掃除などで必須のツールとなります。
仕様(引数・オプション)
構文
find [検索パス] [オプション] [評価式] [アクション]
主なオプション(検索範囲の制御)
| オプション | 説明 |
-L | シンボリックリンクを辿って検索を行います。 |
-maxdepth <数値> | 検索するディレクトリの階層の深さ(最大)を指定します(1を指定すると直下のみ)。 |
-mindepth <数値> | 検索を開始するディレクトリの階層の深さ(最小)を指定します。 |
主な評価式(検索条件)
| 評価式 | 説明 |
-name <文字列> | ファイル名を指定します(ワイルドカード使用可)。大文字小文字を区別します。 |
-iname <文字列> | -name と同様ですが、大文字小文字を区別しません。 |
-type <タイプ> | ファイルの種類を指定します(f:通常ファイル, d:ディレクトリ, l:リンク 等)。 |
-size <サイズ> | ファイルサイズを指定します(k:KB, M:MB, G:GB, +10M:10MB以上)。 |
-mtime <n> | データ更新時刻が n日前のファイルを検索します(+n:n日より前, -n:n日以内)。 |
-mmin <n> | データ更新時刻が n分前のファイルを検索します。 |
-atime / -ctime | アクセス時刻 / ステータス変更時刻で検索します(使い方はmtimeと同様)。 |
-newer <ファイル> | 指定したファイルより新しい更新時刻を持つファイルを検索します。 |
-user <ユーザー> | 指定したユーザーが所有するファイルを検索します(ID指定も可: -uid)。 |
-group <グループ> | 指定したグループが所有するファイルを検索します(ID指定も可: -gid)。 |
-perm <モード> | 指定したパーミッションのファイルを検索します(例: -perm 755, -perm -4000)。 |
-empty | 空のファイルまたはディレクトリを検索します。 |
-regex <パターン> | パス全体に対して正規表現で一致判定を行います。 |
主なアクション(検索後の処理)
| アクション | 説明 |
-print | 検索結果(パス)を標準出力に表示します(デフォルトの動作)。 |
-print0 | 結果をヌル文字区切りで出力します(ファイル名にスペースが含まれる場合のxargs連携用)。 |
-ls | ls -dils 形式で詳細情報を表示します。 |
-delete | 検索にヒットしたファイルを即座に削除します。 |
-exec <コマンド> \; | ヒットしたファイルごとに指定したコマンドを実行します({} がファイル名に置換されます)。 |
-ok <コマンド> \; | -exec と同様ですが、実行前に確認プロンプトを表示します。 |
基本の使い方
最も基本的な使い方は、パスとファイル名を指定して検索することです。
コマンド
# /etc ディレクトリ以下から、名前が "hosts" であるファイルを検索
find /etc -name hosts
実行結果
/etc/hosts
/etc/avahi/hosts
実践コマンド
ワイルドカードでログファイルを検索する
部分一致やパターンを使ってファイルを絞り込みます。
# /var/log 以下から "syslog" で始まり、任意の数字で終わるファイルを検索
find /var/log/ -name "syslog.[0-9]*"
特定ユーザーのファイルを検索する
退職したユーザーのファイルを洗い出す際などに使用します。
# /home/users ディレクトリから、所有者が "deploy_user" であるファイルを検索
find /home/users/ -user deploy_user
ディレクトリの深さを制限して検索する
サブディレクトリを深く探索せず、直下のディレクトリだけを対象にしたい場合に便利です。
# /usr/share/man の直下(深さ1)にある、"man" + 数字1〜3 で始まるディレクトリを検索
find /usr/share/man -maxdepth 1 -type d -name "man[1-3]*"
更新日時で検索して削除する(古いファイルの掃除)
「30日以上前のログ」などを定期的に削除する処理です。+(以上/以前)、-(以内)、数字のみ(ちょうど)の使い分けが重要です。
# 現在から「5日以上前」に更新されたログファイルを検索し、詳細を表示して削除
# (-exec rm -vf {} \;) は、見つけたファイルを rm -vf に渡して実行する記述です
find ./logs -type f -name "*.log" -mtime +5 -exec rm -vf {} \;
removed './logs/app_20250101.log'
removed './logs/app_20250102.log'
期間を指定して検索する(範囲検索)
「2日前より古く、かつ5日前よりは新しい(2〜5日前の)」ファイルを抽出します。
# 2日以上前 かつ 5日以内 に更新されたファイルを表示
find . -type f -mtime +2 -mtime -5 -ls
検索結果をアーカイブする(xargs連携)
検索結果をパイプで xargs に渡し、tar コマンドで一つのファイルにまとめます。-print0 と xargs -0 を使うことで、ファイル名にスペースが含まれていても安全に処理できます。
# カレントディレクトリの .txt ファイルを全て検索し、tar.gz に固める
find . -type f -name "*.txt" -print0 | xargs -0 tar cfvz /tmp/text_files_backup.tgz
カスタムポイント
- 複数条件の結合: デフォルトは AND 検索ですが、
-oを使うことで OR 検索が可能です(例:-name "*.jpg" -o -name "*.png")。 - 除外設定:
!または-notを使うことで条件を反転できます(例:! -name "*.log"でログ以外を検索)。 - サイズ検索:
-size +100M(100MBより大きい)や-size -1k(1KBより小さい)などで、巨大ファイルの特定やゴミファイルの掃除ができます。
注意点
- サーバー負荷:ルートディレクトリ(/)からの全検索(find / …)は、ディスクI/Oに多大な負荷をかけ、サーバーの動作を重くする原因になります。検索パスは可能な限り絞ってください。
- mtime の計算:-mtime +1 は「現在時刻から24時間×1 経過した時刻よりも前(つまり2日以上前)」を意味します。直感より1日ズレることがあるため、厳密な動作確認にはテストファイルの作成をお勧めします。
- コマンド実行のセキュリティ:-exec を使用する際、ファイル名に特殊文字が含まれていると意図しない動作をする可能性があります。可能な限り -exec … {} + や -print0 | xargs -0 の形式を使用してください。
応用
テストデータを作成して検索挙動を確認する
mtime の挙動を理解するために、タイムスタンプを偽装したファイルを作成して実験するスクリプトです。
# 2025年1月5日から9日までの12:00付で空ファイルを作成
for i in $(seq 5 9); do
touch -d "2025-01-0${i} 12:00" "dummy_2025010${i}.txt"
done
# 確認: 7日より前のファイルを検索
find . -name "dummy_*.txt" -mtime +7
まとめ
findコマンドは、Linux管理において最も柔軟で利用頻度の高いコマンドの一つです。「いつ更新されたか」「誰のものか」「どれくらいの大きさか」といった属性でフィルタリングし、そのまま「削除」「移動」「圧縮」といった処理へ繋げることができます。まずは -name での名前検索から始め、徐々に -mtime や -exec を組み合わせた自動化処理へステップアップしていくのがおすすめです。
