find コマンド
find
コマンドはファイルやディレクトリのパスを検索するためのコマンドです。基本的な使い方は以下の通りです。
$ find [検索するパス]
例えば find .
とするとカレントディレクトリ以下の全ファイルとディレクトリを再帰的に走査して表示します。
.
├── FOO.LOG
├── bar
│ ├── bar.txt
│ └── tmp.txt
├── foo.log
├── hoge.txt
└── tmp
上ののようなディレクトリ構造があったとして実行すると次のような出力になります。
$ find .
.
./FOO.LOG
./bar
./bar/bar.txt
./bar/tmp.txt
./foo.log
./hoge.txt
./tmp
ファイル名だけでなくディレクトリ名も出力されていることがわかります。
単純に出力するだけでなく、様々な条件で検索できます。
ファイル名やディレクトリ名を検索するオプションいろいろ
以下のディレクトリ構造でオプションをいろいろ試します。
.
├── FOO.LOG
├── bar
│ ├── bar.txt
│ └── tmp.txt
├── foo.log
├── hoge.txt
└── tmp
-type: ファイルだけを対象にして検索する
ファイル名を検索したい場合は -type f
を、ディレクトリ名だけを検索したい場合は -type d
をオプションにつけて実行します。
# ファイルだけ取得
$ find . -type f
./FOO.LOG
./bar/bar.txt
./bar/tmp.txt
./foo.log
./hoge.txt
# ディレクトリだけ取得
$ find . -type d
.
./bar
./tmp
-name: ファイル名やディレクトリ名で検索する
例えば hoge.txt
というファイル名もしくはディレクトリ名から検索したい場合は -name hoge.txt
をオプションにつけて実行します。
$ find . -name hoge.txt
./hoge.txt
上の例だと hoge.txt
というディレクトリ名があればそれも取得できます。純粋にファイルのみを検索対象とする場合は type -f
も併せて指定してください。
$ find . -type f -name hoge.txt
./hoge.txt
検索の対象となるのはファイル名もしくはディレクトリ名だけで、パス全体ではありません。パス全体を対象とするには後述する -path
オプションを使います。
iname: 大文字小文字を区別しない
-name
ではなく iname
を使えば検索対象の文字列について、大文字と小文字を区別せずに検索できます。
$ find . -iname foo.log
./FOO.LOG
./foo.log
ワイルドカードで検索する
ワイルドカード(*
)を使えば前方一致や後方一致の名称で検索できます。以下の例では拡張子をワイルドカードにして検索しています。
$ find . -name 'hoge.*'
./hoge.txt
./tmp/hoge.log
-path: パス全体で検索する
-name
だとファイル名もしくはディレクトリ名を対象に検索しますが、そのファイルやディレクトリのパス全体は検索対象になりません。パス全体を検索対象にするには -path
オプションを使って検索を指定します。
# パスに 'bar' を含むパスを検索
$ find -path '*bar*'
./bar
./bar/bar.txt
./bar/tmp.txt
-name
で検索すると以下のようになります。./bar/tmp.txt
はファイルですが、ファイル名が tmp.txt
で 'bar' を含まないため検索結果に出力されていないことがわかります。
# ファイル名もしくはディレクトリ名に 'bar' を含むパスを検索
$ find -name '*bar*'
./bar
./bar/bar.txt
-ipath: 大文字小文字を区別しない
-ipath
を使えば大文字と小文字を区別せずに検索できます。-name
に対しての -iname
と同じ関係です。
正規表現で検索する
find
のオプションではなく、パイプでつないで grep
してやるとよいです。
$ find . | grep -E '.+\.(txt|log)' -
./bar/bar.txt
./bar/tmp.txt
./foo.log
./hoge.txt
上の例は拡張子 .txt
もしくは .log
のファイルパスを正規表現で検索しています。
タイムスタンプで検索するオプションいろいろ
-mmin, -mtime: 指定時間より前/以内に更新されたファイルを検索
-mmin +3
で3分より前に更新されたファイルを、-mmin -3
で3分以内に更新されたファイルを検索できます。
# 3分より前に更新されたファイルを検索
$ find . -type f -mmin +3
# 3分以内に更新されたファイルを検索
$ find . -type f -mmin -3
# 3分前に更新されたファイルを検索
$ find . -type f -mmin -3
同様に'分数'ではなく'日数'で条件判定するには -mtime
を指定すればよいです。
-amin, -atime: 指定時間より前/以内にアクセスされたファイルを検索
-amin +3
で3分より前にアクセスされたファイルを、-amin -3
で3分以内にアクセスされたファイルを検索できます。
# 3分より前にアクセスされたファイルを検索
$ find . -type f -amin +3
# 3分以内にされたファイルを検索
$ find . -type f -amin -3
# 3分前にアクセスされたファイルを検索
$ find . -type f -amin -3
-exec: 検索結果のパスに対して処理を実行する
find
コマンドの結果で得られたパスに対して処理を実行するには、-exec
オプションを使います。
例えば find
で見つかったファイルすべてを削除するには -exec rm {} \;
を指定します。{}
に find
で得られたパスが入ります。
$ find . -type f -exec rm {} \;
末尾の \;
を忘れずにつけましょう。つけないと find: missing argument to -exec
というエラーで怒られます。
以上。
> find のオプションではなく、パイプでつないで grep してやるとよいです。
> $ find . | grep -E ‘.+\.(txt|log)’ –
「find . -name ‘*.log’ -o -name ‘*.log’」のほうが、(findが一度余計なファイルを出さない分)cpu負荷は低いのでは