find -followオプションの使い方|シンボリックリンクを辿って検索する方法を初心者向けに解説!
生徒
「Linuxでfindコマンドを使ってファイルを探してたら、シンボリックリンクの中までは検索されてないみたいなんですが、どうすればいいですか?」
先生
「シンボリックリンクを辿って、そのリンク先のファイルも検索したい場合は、-followオプションを使いますよ。」
生徒
「それって、どうやって使うんですか?初心者にもわかるように教えてください!」
先生
「もちろんです。では、find -followの基本的な使い方から順番に解説していきましょう!」
1. findコマンドとは?
findコマンドは、Linuxでファイルやディレクトリを検索するためのコマンドです。パソコンの中を「探偵のように探し回るツール」だと思ってください。
例えば、ある名前のファイルを見つけたい、特定の日付で更新されたファイルだけを探したい、というときにとても便利です。
2. シンボリックリンクとは?
シンボリックリンク(symbolic link)は、別のファイルやディレクトリへの「ショートカット」のようなものです。
Windowsでいうところの「ショートカット」とほぼ同じで、リンク先の実体ファイルを指し示す特別なファイルです。
たとえば、/var/log/apacheというディレクトリにリンクされた/logs/apacheというシンボリックリンクがあったとします。このリンクは中身を持っているわけではなく、実際のファイルは/var/log/apacheにあります。
3. find -follow オプションの基本的な使い方
-followオプションを使うと、シンボリックリンクの中に入って、そのリンク先も調べてくれるようになります。
例えば、ホームディレクトリ以下でaccess.logという名前のファイルを探したい場合、シンボリックリンクを辿って探すには以下のようにします。
find ~ -follow -name "access.log"
/home/user/logs/apache/access.log
このように、リンクの中にあるファイルでも見つけられるのが-followの特徴です。
4. -followなしで検索したときとの違い
-followをつけない場合、シンボリックリンクは「ただのリンクファイル」として扱われ、中まで調べてくれません。
find ~ -name "access.log"
(出力なし)
このように、シンボリックリンクの中に本体があっても見つけられないのです。
5. 実行順序と注意点
findでは、オプションや条件の順番が検索結果に影響することがあります。-followは必ず検索ディレクトリのすぐ後に書くようにしましょう。
たとえば、以下のように書くと正しく動作しません。
find -name "access.log" -follow
find: paths must precede expression
必ず、ディレクトリ → -follow → その他の条件の順で書きましょう。
6. シンボリックリンクの確認方法
「これってシンボリックリンクかな?」と確認したいときは、ls -lコマンドを使うと良いです。
ls -l ~/logs
lrwxrwxrwx 1 user user 20 Sep 15 10:00 apache -> /var/log/apache2
→で矢印が表示されているものが、シンボリックリンクです。
7. -Lオプションとの違い
-followと似たような働きをするのが、-Lオプションです。-Lはfindコマンド全体に影響を与え、「すべてのシンボリックリンクを辿る」設定になります。
find -L ~ -name "access.log"
/home/user/logs/apache/access.log
ただし、-Lは意図しないところまでリンクを辿ってしまうこともあるので、部分的にリンクを辿りたいときは-followを使うのが安全です。
8. よく使うfind -followの組み合わせ
find -followは、他の条件と一緒に使うことで便利さが増します。以下はいくつかの使用例です。
find /var/www -follow -name "*.log"
/var/www/logs/error.log
find /home/user -follow -mtime -3
/home/user/logs/apache/access.log
9. 無限ループに注意
-followを使うときに気をつけたいのが、「無限ループ」のリスクです。
たとえば、あるディレクトリが自分自身を指すリンクを含んでいると、findが永遠にループしてしまうことがあります。
このようなときは、-maxdepthオプションで検索の深さを制限することで回避できます。
find / -follow -maxdepth 5 -name "*.log"