[Linux] find コマンドでファイルやディレクトリを検索する

[Linux] find コマンドでファイルやディレクトリを検索する

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 というエラーで怒られます。

以上。

参考URL

Linuxカテゴリの最新記事