findコマンド入門|ファイルを名前・種類・更新日で探す基本

findコマンド入門|ファイルを名前・種類・更新日で探す基本

「あのファイル、どこに置いたっけ」——ディレクトリを ls で辿りながら探すのは、地味に時間を取られます。

そんなときに手が覚えておくと強いのが find コマンドです。

名前・種類・サイズ・更新日といった条件を並べるだけで、ディレクトリの奥まで一気に探してくれます。

この記事では、私が普段よく使う find の形を、そのままコピペで試せる粒度でまとめてみました。

findの基本形

findコマンドの構造図:起点と条件で組み立てる基本形と、よく使う -name・-type・-mtime・-exec の4条件のまとめ

find の基本形はとてもシンプルです。

「どこを起点に」「何を条件に」探すかを並べるだけ、と考えると迷いません。

たとえばカレントディレクトリ以下から拡張子が txt のファイルを探すなら、こう書きます。

find . -name "*.txt"

先頭の . は「今いるディレクトリ」を指しています。

ここを /var/log などに変えれば、探す起点をそのまま切り替えられるのです。

名前で探す(-name / -iname)

いちばん出番が多いのは、名前で探す -name です。

ワイルドカードの * を使えば、部分一致でまとめて拾えます。

# 拡張子が log のファイル
find . -name "*.log"

# readme で始まるファイル(大文字小文字を無視)
find . -iname "readme*"

大文字小文字を区別したくないときは、-name の代わりに -iname を使います。

* はシェルに先へ展開されないよう、必ずクォートで囲むのがコツです。

このクォートを忘れると、狙ったファイルが見つからず戸惑うことになります。

種類・サイズ・更新日で絞る

名前だけでは絞りきれないときは、条件を足していきましょう。

-type f はファイル、-type d はディレクトリだけに限定する指定です。

# 10MB より大きいファイル
find /var/log -type f -size +10M

# 7日以内に更新されたファイル
find . -type f -mtime -7

-size +10M は「10MB より大きい」、-mtime -7 は「7日以内」という意味になります。

数字の前の + と – で「以上・以内」が反転する点だけ、最初は戸惑いやすいところです。

見つけたファイルに操作する(-exec)

findとgrepの役割分担の図解:findで場所とファイルを絞り込み、-execで渡してgrepが中身を検索する二段構えの流れ

find の便利さが際立つのは、見つけたファイルへそのまま操作を流せるところにあります。

-exec を使うと、マッチした一つひとつにコマンドを実行できるのです。

# 一時ファイルをまとめて削除
find . -name "*.tmp" -delete

# js の中で TODO を含むファイルだけ一覧
find . -name "*.js" -exec grep -l "TODO" {} +

{} はマッチしたファイル名に置き換わる部分で、末尾の + はまとめて渡す指定です。

ここで find は「場所とファイルの絞り込み」、grep は「中身の検索」と役割を分けると、ログ調査やコード検索がぐっと速くなります。

-delete は取り消せないので、まず付けずに結果を確認してから実行するのが安全です。

つまずきポイント

最後に、私がよく踏んだつまずきを3つ挙げておきます。

  • * をクォートで囲み忘れて、シェルが先に展開してしまう
  • 起点の . を付け忘れて、パスを丸ごと打ってしまう
  • -delete や -exec rm を、結果を確認せずに走らせてしまう

どれも一度やらかすと体で覚えるので、最初だけ気をつければ大丈夫です。

最後に

find は覚える条件こそ多いものの、よく使うのは -name・-type・-mtime・-exec の4つくらい

まずはこの4つをコピペで試して、手に馴染ませてみてください。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA