Linux の find コマンドを使ってみる

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

他にも色々なオプションがありますが 「どうしても使わないとならない」という場面以外では 他のコマンドと組み合わせて使う方が シンプルで見やすくなると思います。

Google サイト内検索

Amazonアソシエイト