find -Lオプションの使い方|シンボリックリンクを常に辿って検索する方法を初心者向けに解説!
生徒
「findコマンドでファイルを探してるんですけど、シンボリックリンクの中まで検索されてない気がします。リンク先も含めて調べるにはどうしたらいいですか?」
先生
「そんなときには-Lオプションを使えば、常にリンクの中身も含めて検索できますよ。」
生徒
「-Lっていうのは、どんな意味なんですか?」
先生
「-Lは『リンク(Link)をたどる』という意味で、findコマンドにリンク先まで見に行くよう指示するオプションです。では、詳しく見ていきましょう。」
1. findコマンドとは?
findコマンドは、Linuxでファイルやディレクトリを条件に合わせて検索できる強力なツールです。指定したフォルダの中から「名前」「種類」「更新日」などの条件でファイルを探すことができます。
たとえば、「名前にlogがついているファイル」や「最近更新されたファイル」なども簡単に見つけることができます。
2. シンボリックリンクとは?
シンボリックリンク(symbolic link)とは、あるファイルやディレクトリを指し示す「案内板」のような存在です。
たとえば、/logs/apacheというリンクがあって、それが/var/log/apache2という実体を指している場合、/logs/apacheを通じて中身を見ることができますが、本体は別の場所にあるわけです。
3. find -Lオプションとは?
find -Lオプションは、検索時にシンボリックリンクを常に辿ってリンク先のファイルやディレクトリも含めて調べるためのオプションです。
つまり、リンク先の実体ファイルも検索の対象になります。
以下のように使います:
find -L /home/user -name "error.log"
/home/user/logs/apache/error.log
この例では、/home/user/logs/apacheがシンボリックリンクでも、リンク先にerror.logがあればちゃんと見つけてくれます。
4. -Lと-followの違い
-Lとよく似たオプションに-followがあります。両者の違いは以下のとおりです:
-L:findの実行中ずっと、すべてのシンボリックリンクを辿る-follow:検索対象のリンクが見つかったときだけ、そのリンクを辿る
広範囲にリンク先も含めて検索したいときは-L、限定的にリンクを辿りたいときは-followがおすすめです。
5. -Lのよくある使い方
シンボリックリンクを多用しているシステムでは、-Lを使うことで漏れなく検索できます。
find -L /var/www -name "*.log"
/var/www/logs/access.log
find -L /home/user -mtime -7
/home/user/logs/nginx/access.log
6. 無限ループに注意しよう
-Lを使うと、リンクがリンクを辿るような循環構造になっていると、無限ループに陥る可能性があります。
たとえば、/dir1から/dir2へ、/dir2から再び/dir1へのリンクがある場合、findは永遠に回り続けてしまいます。
これを防ぐには、-maxdepthで深さを制限したり、-typeでファイルの種類を絞ると安全です。
find -L / -maxdepth 5 -name "*.log"
7. -Lと使えるオプションの組み合わせ
-Lは他のオプションとも組み合わせて使えます。
find -L /home/user -type f -name "*.conf"
/home/user/config/httpd.conf
find -L /var/log -size +1M
/var/log/old_logs/bigfile.log
8. シンボリックリンクの確認方法
「これはリンクかな?」と思ったときはls -lで確認しましょう。
ls -l /home/user/logs
lrwxrwxrwx 1 user user 20 Sep 15 12:00 apache -> /var/log/apache2
→矢印でリンク先が表示されていれば、シンボリックリンクです。
9. -Hや-Pとの違い
実はfindには-Lの他にも、-Hや-Pというオプションがあります。
-L:すべてのリンクを辿る(今回の記事の主役)-H:コマンドライン引数にあるリンクだけ辿る-P:リンクを一切辿らない(デフォルト動作)
通常は-Pの動作なので、リンク先まで検索したいときは明示的に-Lをつけましょう。