「あのファイル、どのディレクトリに置いたっけ?」「30日より前に作られたログだけ消したい」——こうした場面で活躍するのが Linux の find コマンドです。find は、指定した場所以下からファイルやディレクトリを名前・種類・更新日時・サイズなどの条件で探し出すコマンドです。見つけたファイルに対してそのまま処理を実行することもでき、サーバー運用に欠かせません。この記事では、find の基本の使い方から、よく使う条件、見つけたファイルへの操作、つまずきやすい点までを初心者の方にも分かるように解説します。
目次
find の基本の使い方
find は「どこから探すか(検索開始ディレクトリ)」と「どんな条件で探すか」を指定して使います。もっとも基本的なのは、名前で探す -name です。. は現在のディレクトリを表します。
# 書式: find 検索場所 条件
# 現在のディレクトリ以下から style.css を探す
find . -name "style.css"
find は指定した場所のサブディレクトリも含めてすべて探します。見つかったものはパス付きで一覧表示されます。grep がファイルの「中身」を探すのに対し、find はファイルそのものを「名前や属性」で探す、と覚えると違いが分かりやすいでしょう。
名前で探す(ワイルドカード)
-name では *(任意の文字列)などのワイルドカードが使えます。「拡張子が .log のファイルすべて」のように、パターンで探せます。大文字小文字を区別せず探したいときは -iname を使います。
# .log で終わるファイルをすべて探す
find . -name "*.log"
# 大文字小文字を区別しない(README も readme も)
find . -iname "readme*"
ここで重要なのが、ワイルドカードを使うパターンは必ず "*.log" のように引用符で囲むことです。理由は後ほど「つまずきやすい点」で説明します。
よく使う条件
名前以外にも、さまざまな条件で絞り込めます。代表的なオプションを表にまとめます。これらは組み合わせて使うこともできます。
| オプション | 意味 |
|---|---|
-name / -iname | 名前で探す(i は大文字小文字を無視) |
-type f | ファイルだけ |
-type d | ディレクトリだけ |
-mtime n | 更新日時が n 日前 |
-size n | サイズで絞る |
-maxdepth n | 探す階層の深さを制限 |
たとえば「ファイルだけ」を対象にしたいときは -type f を加えます。条件を複数並べると、すべてを満たすもの(AND 条件)が対象になります。
# ファイルのうち .php で終わるものだけ
find . -type f -name "*.php"
# ディレクトリだけを一覧表示
find . -type d
更新日時・サイズで探す
古いファイルの整理には -mtime が便利です。数値の前に + を付けると「それより前」、- を付けると「それ以内」を意味します。-mtime +30 なら「30日より前に更新されたもの」です。
# 30日より前に更新されたログを探す
find . -name "*.log" -mtime +30
# 24時間以内に更新されたファイル
find . -type f -mtime -1
サイズで探すときは -size を使います。単位は k(キロバイト)・M(メガバイト)などで指定し、+ / - で「以上・以下」を表します。-size +10M なら「10MB より大きいファイル」です。容量を圧迫している大きなファイルを探すのに役立ちます。
見つけたファイルに処理を実行する -exec
find の強力なところは、見つけたファイルに対してそのままコマンドを実行できる点です。-exec に続けてコマンドを書き、ファイル名が入る位置に {} を置き、最後を \; で閉じます。
# 見つけたファイルの詳細を表示する
find . -name "*.log" -exec ls -l {} \;
# 30日より前のログを削除する(実行は慎重に)
find . -name "*.log" -mtime +30 -exec rm {} \;
rm と組み合わせる削除は強力なぶん危険です。実行する前に、まず -exec を付けずに find だけを実行し、対象が本当に消したいファイルだけかを必ず確認してください。意図しないファイルが含まれていないかを目視してから削除に進むのが安全です。
うまく探せないときの確認点
ワイルドカードが展開されてしまう
find . -name *.log のように引用符を付けないと、*.log を find に渡す前にシェルが現在のディレクトリのファイル名へ展開してしまい、意図しない結果やエラーになります。ワイルドカードを含むパターンは、必ず "*.log" と引用符で囲むのが鉄則です。
大量の権限エラーが出る
ルートディレクトリなど広い範囲を探すと、アクセス権のないディレクトリで「Permission denied」が大量に表示されることがあります。エラー表示を消したいときは、末尾に 2>/dev/null を付けてエラー出力を捨てると、結果が見やすくなります。
# 権限エラーを表示せずに探す
find / -name "php.ini" 2>/dev/null
検索が遅い・範囲が広すぎる
探す範囲が広いと時間がかかります。階層を浅く限定したいときは -maxdepth が有効です。find . -maxdepth 1 -name "*.txt" なら、現在のディレクトリ直下だけを探し、サブディレクトリには入りません。
まとめ
find は、ファイルを名前や属性で探し、見つけたものに処理まで行える強力なコマンドです。要点を整理します。
- 基本は
find 検索場所 条件。名前は-name、大文字小文字無視は-iname。 -type f/-type dでファイル・ディレクトリを絞る。条件は AND で重ねられる。-mtimeで更新日時、-sizeでサイズ、-maxdepthで階層を制限。-exec コマンド {} \;で見つけたファイルに処理を実行できる。- ワイルドカードは引用符で囲む。
rm前は必ず対象を確認する。
まずは find . -name "*.拡張子" でファイルを探すところから始め、慣れてきたら -type や -mtime で絞り込み、最後に -exec での一括処理へと広げていくと、サーバー作業が一気に効率化します。