utte

find 条件に合うファイルをディレクトリの下から探す

find [探す場所] [条件] [アクション]

試してみる

主なオプション

-name パターン名前で探す。大文字小文字を区別しない場合は -iname
-type 種類ファイルの種類で探す。f は通常のファイル、d はディレクトリ、l はシンボリックリンク
-size nサイズで探す。+1k は1KBより大きい、-1M は1MB未満
-mtime n更新日時で探す。+7 は7日より前、-7 は7日以内
-user 名前所有者で探す
-perm モード権限で探す。-perm 644 はちょうど644、-perm -u+x は所有者に実行権限があるもの
-exec コマンド {} \;見つかったファイルごとにコマンドを実行する
-maxdepth n探すディレクトリの深さを制限する

解説

基本の形

find 探す場所 条件 と書きます。探す場所を省くとカレントディレクトリです。標準では、条件に合ったファイルのパスを表示します。条件を指定しなければ、下にあるすべてを表示します。

名前の条件

-name のパターンは、シェルではなく find に渡す必要があります。*.css はシェルが展開してしまうので、"*.css" のように引用符で囲みましょう。

数値の指定

-size、-mtime などの数値は、n(ちょうど)、+n(より大きい)、-n(より小さい)の3通りがあります。-size の単位は c(バイト)、k、M、G です。-mtime は24時間を1日として数えます。

条件の組み合わせ

条件を並べると、すべてを満たすもの(AND)になります。-o で OR、! で否定です。たとえば find . -name "*.log" -o -name "*.tmp" のようにします。

見つけたものに処理をする

-exec コマンド {} \; は、1件ずつコマンドを実行します。\; の代わりに + を使うと、まとめて1回のコマンドに渡せます。-delete は削除です。条件を先に書いて確かめてから使いましょう。

このコマンドを使う問題

  1. findでサブディレクトリを含めて.tmpファイルを削除する
  2. iノード番号から同じファイルを指すハードリンクを探す
  3. findでシステム全体からファイル名で探す
  4. findで探した結果をファイルに保存する
  5. findとxargsで条件に合うファイルをまとめて処理する

関連するコマンド

LinuC 101の出題範囲