find -Hオプションの使い方|コマンドライン引数のシンボリックリンクだけを辿る方法を初心者向けに解説!
生徒
「findコマンドでシンボリックリンクを辿って検索したいんですが、-Lを使うと全部のリンクを辿ってしまいますよね?ちょっと限定的に辿りたいんですけど…」
先生
「そんなときは-Hオプションが便利です。指定したパスがシンボリックリンクだったときだけ辿るんですよ。」
生徒
「それって他のリンクは辿らないんですか?」
先生
「そうです。コマンドライン引数で指定した部分だけを辿るので、安全かつ必要なところだけリンクをたどって検索できます。」
1. findコマンドとは?
findコマンドは、Linuxでファイルやディレクトリを効率的に検索できる便利なコマンドです。名前や更新日、ファイルサイズなど、さまざまな条件で目的のファイルを見つけることができます。
特にLinuxのようなファイル構造が複雑なシステムでは、findコマンドは非常に重宝されます。
2. シンボリックリンクとは?
シンボリックリンクとは、あるファイルやディレクトリへの「案内板」のようなもので、リンクを通して別の場所のファイルにアクセスできます。
例えば/home/user/logsが/var/logへのリンクになっていれば、logsを操作すると実際には/var/logにアクセスしていることになります。
3. find -Hオプションとは?
-Hオプションは、コマンドライン引数にあるシンボリックリンクのみを辿って検索するオプションです。
つまり、findコマンドに指定したディレクトリ自体がリンクであった場合にだけ、そのリンク先を辿って検索を行います。
途中に現れる他のシンボリックリンクは無視され、リンク先の中身までは見に行きません。
4. find -Hオプションの使い方
たとえば、/logsというシンボリックリンクが/var/log/apache2を指しているとします。
このとき、/logsをfindの引数に指定すれば、-Hでリンク先の中まで検索できます。
find -H /home/user/logs -name "*.log"
/home/user/logs/access.log
一方で、/home/user/logsの中にさらに別のリンクがあっても、-Hではその中までは辿りません。
5. -Hと-Lと-Pの違いを比較
-Hの動作をより理解するために、似ているオプション-Lと-Pとの違いを比べてみましょう。
-L:すべてのシンボリックリンクを辿って検索-H:コマンドライン引数だけを辿る-P:リンクは一切辿らない(デフォルト動作)
・/shortcut → /var/logs(←リンク)
・/var/logs/syslink → /etc/config
find -H /shortcut -name "config.yaml"
/shortcut/syslink は辿られない(出力なし)
find -L /shortcut -name "config.yaml"
/shortcut/syslink/config.yaml
find -P /shortcut -name "config.yaml"
(リンク無視。出力なし)
6. -Hを使うべき場面とは?
-Hオプションが役立つのは、リンクの中まで見たいけれど、他の場所のリンクは辿りたくないときです。
例えば、ログディレクトリだけ別の場所にあって、そこだけ検索対象にしたい場合などに向いています。
7. シンボリックリンクの確認方法
指定しようとしているディレクトリがシンボリックリンクかどうかは、ls -lコマンドで確認できます。
ls -l /home/user
lrwxrwxrwx 1 user user 20 Sep 16 11:00 logs -> /var/log/apache2
このように→でリンク先が表示されているものが、シンボリックリンクです。
8. -Hと他のオプションの組み合わせ
-Hは他の条件と組み合わせることで、より柔軟にファイル検索が可能になります。
find -H /logs -mtime -3
/logs/access.log
find -H /logs -type f -name "*.conf"
/logs/apache.conf
9. トラブルを避けるための注意点
-Hオプションは限定的にリンクを辿るため、リンクの中にさらにリンクがある場合は対象外になります。
そのため、複雑なリンク構造がある場合は、検索できないファイルが出てくることもあります。
そうしたケースでは、-Lや-followを使うことも検討してください。