find コマンドは 色々な条件でファイルを探してリストを出力してくれる 便利なコマンドです。 しかし、全てのオプションは とても覚えきれません。 そこで今回は“最低限これだけは”という内容に絞って 紹介したいと思います。
まずはパスの指定です。
find コマンドは指定したパス以下を検索します。
パスの指定をしないと カレントディレクトリを指定したことになります。 また、パスの指定によって結果の表示も変わってしまいます。 (オプションで変更することはできますが、今回は割愛します)
例えば、パスを「相対パス」で指定した場合、次のように 結果の出力も相対パスになります。
$ find ./hogehoge
./hogehoge
./hogehoge/a.txt
./hogehoge/b.txt
「絶対パス」で指定すれば 結果も絶対パスになります。
$ find /home/hogehoge
/home/hogehoge
/home/hogehoge/a.txt
/home/hogehoge/b.txt
次に抽出条件です。
多くの場合、「ファイル名」か「更新日」になると思います。
ファイル名は "-name" オプションで 条件を指定できます。
$ find . -name "*.txt" ./hogehoge/a.txt ./hogehoge/b.txt
この例では "*.txt" にマッチするファイルのみを抽出しました。 マッチングには "*" や "?" を使うことができます。
ただし、マッチングの対象になるのはパスの最後のエントリー名(上の例では "a.txt" や "b.txt")のみで、途中のパスは対象になりません。 ディレクトリ自体が最後のエントリーの場合は、そのディレクトリ名が マッチングの対象になります。
$ find . -name "hoge*" ./hogehoge
更新日は "-mtime" オプションで ファイルが更新されてからの時間が指定できます。
$ find . -mtime +3 ./hogehoge/a.txt
値の指定は、プラス "+" の場合 〜日以上前(上の例の場合 3 日以上前)で マイナス "-" の場合 〜日以内となります。
$ find . -mtime -3 ./hogehoge ./hogehoge/b.txt
取得したパスに対して処理を行ないたいときがあります。
例えば「 3 日以上前の zip ファイルを削除する」といった場合ですが 対象の取得は 次のようなオプションで指定できます。
$ find /var/backup -mtime +3 -name "*.zip" /var/backup/a.zip /var/backup/b.zip
これに対して処理をするわけですから イメージとしてはパイプを使って 次のようになります。
$ find /var/backup -mtime +3 -name "*.zip" | while read path > do > rm $path > done
同じ動作を "-exec" オプションで指定することができます。
$ find /var/backup -mtime +3 -name "*.zip" -exec rm {} \;
"-exec" 以降、"\;" までがコマンドになります。
"{}" の部分に取得されたパスが入ります。
その他のオプションでオススメなのは "-ls" です。 このオプションを付けると結果の出力を ls コマンドと同じような 形にしてくれます。
$ find . -ls 10767946 12 drwxr-xr-x 1 u g 4096 11月 20 2009 ./hogehoge 10768066 4 -rw-r--r-- 1 u g 512 11月 15 2009 ./hogehoge/a.txt 10768041 4 -rw-r--r-- 1 u g 512 11月 20 2009 ./hogehoge/b.txt
他にも色々なオプションがありますが 「どうしても使わないとならない」という場面以外では 他のコマンドと組み合わせて使う方が シンプルで見やすくなると思います。