らっちゃいブログ

日々の学びと気づきを発信するブログ

find がいらないなんて言わせねえよ!

スポンサーリンク

前回の記事では locate コマンドをご紹介しました。

racchai.hatenablog.com

その結果、友人が

『じゃあもう find いらないじゃん』

とかいうものですから、そういうことじゃないということで find についての記事を書いておくことにします。

find を使うケースはいろいろあるのですが、個人的によく使うコマンド例をご紹介します。

ファイルだけ/ディレクトリだけほしい

find コマンドには -type オプションが存在しており、ここに指定したタイプで結果を絞り込むことができます。

/etc/nginx 以下のファイルだけほしい場合

$ find /etc/nginx -type f
/etc/nginx/naxsi.rules
/etc/nginx/mime.types
/etc/nginx/koi-win
/etc/nginx/scgi_params
/etc/nginx/fastcgi_params
/etc/nginx/win-utf
/etc/nginx/uwsgi_params
/etc/nginx/sites-available/default
/etc/nginx/naxsi_core.rules
/etc/nginx/proxy_params
/etc/nginx/koi-utf
/etc/nginx/naxsi-ui.conf.1.4.1
/etc/nginx/nginx.conf

/etc/nginx 以下のディレクトリだけほしい場合

$ find /etc/nginx -type d
/etc/nginx
/etc/nginx/sites-enabled
/etc/nginx/sites-available
/etc/nginx/conf.d

その他にも、シンボリックリンク(l)やソケット(s)などいろんなタイプを指定することが可能です。

最近作成/更新されたファイルがほしい

例えば、定期的に古いログファイルを削除したいケースなどで利用します。作成されてから30日以上経過したログファイルを探し出したいときは、以下のように実行すればすぐに見つかります。

$ find /var/log/myapp/ -type f -mtime -30

逆に直近30日前のログファイルを出力する場合はこちら。-+に変えるだけです。

$ find /var/log/myapp/ -type f -mtime +30

ちなみにですが、-delete オプションを付与してやれば検索結果のファイルを削除することもできます。

$ find /var/log/myapp/ -type f -mtime -30 -delete

検索結果を受けてコマンドを実行したい

これもよくやりますね。例えば、/var/log/myapp/{日付}/{時間}/error.log のようなログファイルがあったときに、すべての日付の13時台のログから特定の文字列を抽出したりします。ちょっと例が特殊ですかね。気にせず実行例を書いてみます。

$ find /var/log/myapp/ -name 13 -type d -exec "grep SomeError {}" \;

少しだけ解説しますと、-exec オプションの中に実際に実行するコマンドを記載します。実行時に検索結果の各行が{}に代入され、順番に実行されていきます。最後の \; がコマンド終了を意味しています。

コマンド自体は少し複雑かもしれませんが、これを覚えておくといろいろと便利なのでおすすめです。

中にはそれ xargs でできるよ!という方もいると思いますが、xargs よりも -exec の方ができることのバリエーションが多いので好きです。

最後に

紹介する例は少なかったですが、locate コマンドとは利用シーンが明確に異なることがわかっていただけたでしょうか。locate コマンドはファイルが見つからない場合の最終手段で、細かく条件を指定して便利にファイルやディレクトリを検索するためのものが find なのです。find がないと本当に困るんです。

もう find がいらないなんて、言わせねえよ!