find コマンドはLinuxで最もよく使われる検索ツールのひとつです。
ファイル名だけでなく、ファイルの種類・更新日時・サイズ・パーミッションなど、さまざまな条件を組み合わせてファイルを探すことができます。
基本的な使い方
find の基本構文は次のとおりです。
find <検索起点ディレクトリ> <オプション>
カレントディレクトリ以下のすべてのファイルを列挙するには、起点として . を指定します。
find .
ファイル名で検索する(-name)
-name オプションで、ファイル名(パターン)を指定して検索できます。
find . -name "*.log"
大文字・小文字を区別しない場合は -iname を使います。
find /var/log -iname "*.Log"
ファイルの種類で絞り込む(-type)
-type オプションで、通常ファイル・ディレクトリ・シンボリックリンクなどに絞り込めます。
| 値 | 意味 |
|---|---|
f | 通常ファイル |
d | ディレクトリ |
l | シンボリックリンク |
# ディレクトリだけ列挙
find . -type d
# 通常ファイルだけ列挙
find . -type f
更新日時で絞り込む(-mtime)
-mtime オプションで、最終更新日時を基準に絞り込めます。
# 過去24時間以内に更新されたファイル
find . -mtime -1
# 7日以上前に更新されたファイル
find . -mtime +7
- は「より前」、+ は「より後(古い)」を意味します。
サイズで絞り込む(-size)
-size オプションでファイルサイズを条件にできます。単位は c(バイト)、k(キロバイト)、M(メガバイト)などを使います。
# 1MB以上のファイルを検索
find . -size +1M
# 100バイト未満の空に近いファイル
find . -type f -size -100c
見つかったファイルに対してコマンドを実行する(-exec)
-exec を使うと、見つかったファイルに対してそのまま別のコマンドを実行できます。{} がファイルパスに展開され、末尾は \; で締めます。
# 見つかった .log ファイルをすべて削除する
find /tmp -name "*.log" -mtime +7 -exec rm {} \;
複数ファイルをまとめて渡す場合は + を使うとより効率的です。
find . -name "*.txt" -exec cat {} +
複数条件を組み合わせる
デフォルトは AND 条件です。OR 条件には -o を使います。
# .sh または .py ファイルを検索
find . -name "*.sh" -o -name "*.py"
条件を否定するには ! を使います。
# .git ディレクトリを除外して検索
find . -type d ! -name ".git"
練習問題
理解を確認するために、以下の問題に挑戦してみましょう。
問題 1
ホームディレクトリ(~)以下にある、拡張子が .sh のファイルをすべて列挙するコマンドを書いてください。
問題 2
/var/log ディレクトリ以下にある、過去3日以内(-mtime -3)に更新された通常ファイルを検索するコマンドを書いてください。
問題 3
カレントディレクトリ以下にある、サイズが10MB超のファイルを検索し、見つかったファイルのパスを large_files.txt に書き出すコマンドを書いてください(リダイレクトを使用)。
問題 4
/tmp 以下にある拡張子 .tmp のファイルを検索し、rm コマンドで削除する one-liner を書いてください。
解答
問題 1
find ~ -name "*.sh"
問題 2
find /var/log -type f -mtime -3
問題 3
find . -type f -size +10M > large_files.txt
問題 4
find /tmp -name "*.tmp" -exec rm {} \;
# または(より効率的)
find /tmp -name "*.tmp" -delete
-delete オプションは -exec rm {} \; と同等ですが、外部コマンドを起動しない分高速です。