めっちゃ便利やねん find コマンドのオプションまとめ

めっちゃ便利やねん find コマンドのオプションまとめ

こんにちは nakamura です。そういえば 4/1 から 神奈川県公共的施設における受動喫煙防止条例 が施行されましたね。今のところよく行くお店でそれらしい光景は見掛けませんが、先日行った居酒屋はものの見事に禁煙になっていて心なしか客足もまばらな感じでした。神奈川県の飲食はこれから厳しそうですな。

さてさて思わず関西弁になってしまうほど便利な find コマンドを今日はご紹介します。比較的有名なコマンドですが、オプションが相当な数あり正直全てを把握するのは無理かもしれません。ただ、よく使うものだけでも頭に入れておくと何かと便利な優れものなのです。

基本的なオプション

まずは基本的な使い方。

-type

ファイルタイプの指定に使用するオプションです。スペシャルファイルや名前付きパイプ等様々な引数がありますが、よく使うのはディレクトリを示す d と通常ファイルを示す f でしょうか。

-name, -iname

パターンマッチングな文字列でファイル名、ディレクトリ名を検索してくれます。-iname にすると大文字、小文字を区別しません。

以下は /var/www/htdocs/ 以下の名前が plugin* に合致するディレクトリを検索する例です。

find /var/www/htdocs/ -name "plugin*" -type d

頭に ! マークを付けると逆に合致しないものが表示されます。以下は拡張子が .php ではないファイルを検索する為の例です。

find /var/www/htdocs/ ! -name "*.php" -type f

また、オプションとオプションを -o でつなぐと OR 条件になります。以下は拡張子が .jpg か .gif のファイルを検索する例です。OR 条件と AND 条件を組み合わせる場合はどちらの条件式を優先させるのか明示する必要があるので優先させたい条件式を \( \) で囲みます。

find /var/www/htdocs/ \( -name "*.jpg" -o -name "*.gif" \) -type f

一部誤りがあったので訂正しました。2010/4/12

何かと便利なオプション

もうちょっと複雑な検索がしたい!という時に使うオプションです。find コマンドの真骨頂はここからですよ。

-atime, -ctime, -mtime

ファイルのタイムスタンプを元に検索してくれます。-atime は最後にアクセスされた、-ctime は最後にステータスが変更された、-mtime は最後に修正されたタイムスタンプを見ます。いずれも指定した数字× 24 時間前であれば検索に引っ掛かりますが、より細かい時間を見たい場合は -amin, -cmin, -mmin を使うと分単位で検索する事が可能です。

-user, -group

ファイルのユーザやグループを元に検索します。

-perm

ファイルのパーミッションを元に検索します。例えばパーミッション 744 のファイルを全て 644 に直したい!という時に重宝します。

-path

個人的に中々良く使います。指定したパターンマッチングな文字列を元にファイルまでのパスを検索します。-regex も同様のオプションですが、若干正規表現の挙動が違います。

-exec

個人的にむちゃくちゃ良く使います。このオプションがあるが為に find コマンドは素晴らしい、とさえ言えます。条件に合致したファイルに対して -exec 以降に指定したコマンドを実行する事が出来ます。\; までの文字列がコマンドとして認識され、{} が find での検索にヒットしたファイル名、ディレクトリ名に置き換えられます。-exec を使う場合、条件式に誤りがあると予期しない結果を招く恐れがあるので(消してはいけないファイルを消してしまったり)、必ず一度 -exec なしで実行して検索結果が期待するものである事を確認しましょう。

-ok

-exec と同様に指定したコマンドを実行する事が可能ですが、こちらはコマンドを実行する前に確認のプロンプトを表示してくれます。シェルスクリプトで使うと便利です。

実際の使用例

個人的にあるある!なコマンド実行例です。

.svn ディレクトリを全て削除する。

find /var/www/htdocs/ -type d -name ".svn" -exec rm -rf {} \;

.svn を除外したディレクトリから __construct という文字列が記述されたファイルを検索、表示する。これむちゃくちゃ良く使います。

find /var/www/htdocs/ -type f ! -path "*.svn*" -exec grep "__construct" {} \; -print

パーミッション 777 でない tmp という名前のディレクトリを全て 777 に変更する。

find /var/www/htdocs/ -type d ! -perm 777 -name "tmp" -exec chmod 777 {} \;

オーナー apache のファイル、ディレクトリをオーナー root に変更する。

find /var/www/htdocs/ -user apache -exec chown root:root {} \;

7 日よりも前に出来たファイルを削除する。バックアップスクリプト等でファイルのローテーションをするのに良く使います。

find /var/backup/ -type f -mtime +7 -exec -rm -f {} \;

ちなみに -exec オプションは、パイプでつないで xargs を使って検索結果をコマンドに引き渡すのと動作的には同じです。↓こんな感じ。

find /var/backup/ -type f -mtime +7 | xargs rm -f

パフォーマンス的な面は計測した事がないので分かりませんが、個人的な経験でいうと xargs を使った場合、日本語やスペースを含む名前のファイルやディレクトリが正常に処理されない事があるので、僕は意識的に -exec を使うようにしています。

終わりに

find コマンドのオプションはまだまだあるので他のものも見てみたい!という方はコマンドラインで man find と実行してマニュアルページを参照して下さい。Linux でのファイル検索に関しては find が最強だと思います。積極的に活用していきましょう!

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ