こんにちは、たねやつです。
このシリーズでは、Linuxの基本的なコマンドを一つずつ取り上げ、その使い方を具体的な例とともに解説していきます。今回は、指定した条件に合うファイルやディレクトリを検索するための強力なコマンド、findです。
findコマンドとは?
findコマンドは、ファイル名、サイズ、更新日時、パーミッションなど、非常に多彩な条件でファイルシステムを検索することができます。grepがファイルの中身を検索するのに対し、findはファイルそのもの(メタデータ)を検索するのが主な役割です。
主な検索条件(テスト)
| テスト | 説明 |
|---|---|
-name [パターン] |
指定したファイル名パターン(例: *.txt)に一致するファイルを検索します。大文字小文字を区別します。 |
-iname [パターン] |
-nameと似ていますが、大文字と小文字を区別しません。 |
-type [種類] |
ファイルの種類を指定します。f (通常ファイル), d (ディレクトリ), l (シンボリックリンク)など。 |
-mtime [日数] |
ファイルの最終更新日時がn日前のものを検索します。-n (n日以内), +n (n日より前)。 |
-size [サイズ] |
ファイルサイズで検索します。+10M (10MBより大きい), -1k (1KBより小さい)のように指定します。 |
-user [ユーザー名] |
指定したユーザーが所有するファイルを検索します。 |
-perm [パーミッション] |
指定したパーミッションを持つファイルを検索します。例: 755。 |
主なアクション
| アクション | 説明 |
|---|---|
-print |
見つかったファイルのパスを表示します(デフォルトの動作)。 |
-ls |
ls -l形式で詳細情報を表示します。 |
-delete |
見つかったファイルを削除します。 |
-exec [コマンド] {} \; |
見つかったファイルそれぞれに対して、指定したコマンドを実行します。{}がファイル名に置き換わります。 |
具体的な使用例
状況1: ホームディレクトリ以下にある全ての.logファイルを検索したい
ログの整理のため、ホームディレクトリ配下に散らばっている拡張子が.logのファイルを探したい場面です。
find ~ -name "*.log"
ホームディレクトリ(~)から検索を開始し、名前に.logが含まれるファイルが一覧表示されます。
状況2: 1週間以内に更新された設定ファイル(*.conf)を探したい
/etcディレクトリ以下で、ここ7日以内に変更された設定ファイル(.confで終わるファイル)を特定したい場面です。
find /etc -name "*.conf" -mtime -7
-mtime -7は、最終更新が7日前から今日までのファイル(7日以内)を意味します。
状況3: サイズが100MBを超える巨大なファイルを探して削除したい
ディスク容量を圧迫している大きなファイルを見つけ出し、確認の上で削除したい場面です。
# まずは検索して一覧表示 find / -type f -size +100M -ls # 確認後、-deleteオプションで削除を実行 # find /path/to/target -type f -size +100M -delete
-type fで通常ファイルのみを対象とし、-size +100Mで100メガバイトより大きいファイルを検索します。-deleteを使う際は、事前に-lsなどで対象をよく確認することが重要です。
状況4: すべての画像ファイル(.jpg)のパーミッションを644に変更したい
カレントディレクトリ以下の全ての.jpgファイルのパーミッションを、一括で644(所有者は読み書き可、他は読み取りのみ可)に変更したい場面です。
find . -name "*.jpg" -exec chmod 644 {} \;
-execアクションは非常に強力で、見つかったファイルに対して任意のコマンドを実行できます。{}が見つかったファイル名に置き換わり、コマンドの終わりを;(シェルでの特殊文字なので\でエスケープ)で示します。
最後に
今回はfindコマンドについて解説しました。非常に多機能で、オプションを組み合わせることで複雑な条件のファイル検索が可能です。特に-execは、検索したファイルに対する一括処理を可能にするため、システム管理や定型作業の自動化に絶大な威力を発揮します。