find -Pオプションの使い方|シンボリックリンクを辿らない(デフォルト動作)をやさしく解説
生徒
「先生、Linuxのfindコマンドって、リンク先も勝手に探しに行くんですか?」
先生
「いい質問ですね。実は、findはデフォルトでシンボリックリンクを辿らないんです。」
生徒
「えっ?じゃあ、リンクを辿って中身を探すことはないんですか?」
先生
「そのとおり。-Pオプションを使えば、明示的に“リンクを辿らない”ことを指定できます。では、くわしく見ていきましょう!」
1. findコマンドとは?
findコマンドは、Linuxでファイルやディレクトリを検索するためのコマンドです。特定の名前、サイズ、更新日、所有者などの条件を指定して、目的のファイルを探すことができます。たとえば「あるフォルダの中に.txtファイルをすべて探したい」などのときに使います。
2. シンボリックリンクとは?初心者向けに解説
シンボリックリンク(英語で symbolic link)は、Windowsでいう「ショートカット」のようなものです。リンクされたファイルやフォルダへの“案内板”のような役割をもちます。
たとえば、data.txtというファイルに対してlink.txtというシンボリックリンクを作ると、link.txtを通じてdata.txtの中身にアクセスできるようになります。
3. find -Pオプションとは?
-Pオプションは、「シンボリックリンクを辿らないでください」という意味です。実はこれがfindコマンドのデフォルト(初期設定)の動作です。
でも、他のオプションとの組み合わせや、スクリプトで使うときに挙動を明確にするために、あえて-Pを明示することもあります。
なお、逆に「リンク先を辿りたい」ときは-Lオプションを使います。
4. 実際にfind -Pを使ってみよう
まず、サンプルのディレクトリを用意します。次のように、普通のファイルとシンボリックリンクを用意して確認してみましょう。
mkdir testdir
cd testdir
touch realfile.txt
ln -s realfile.txt linkfile.txt
find -P .
.
./realfile.txt
./linkfile.txt
この例では、realfile.txtと、それを指すlinkfile.txtというシンボリックリンクがあります。
find -P .では、リンクそのもの(linkfile.txt)は表示されますが、リンク先の中身は検索されません。
5. -Pオプションと他のfindオプションの組み合わせ
たとえば「特定の名前を持つファイルを探す」場合も、-Pを付けることでリンクを辿らずに検索できます。
find -P . -name "realfile.txt"
./realfile.txt
このように、リンクの先にあるrealfile.txtではなく、本体が存在している場所だけが結果に出ます。
6. -P(リンクを辿らない)と-L(リンクを辿る)の違い
初心者の方が混乱しやすいのが、-Pと-Lの違いです。
-P:リンクを辿らない(デフォルト)-L:リンクを辿って検索する
たとえば、次のようにするとリンク先のファイルも検索対象になります。
find -L . -name "realfile.txt"
./realfile.txt
./linkfile.txt
-Lを使うと、linkfile.txtの先にあるrealfile.txtも検索されてしまいます。
7. find -Pが役立つ場面とは?
Linuxでは、リンクが複雑に張り巡らされている場合があります。例えば、大きなログファイルや設定ファイルなどを指すリンクをうっかり辿ってしまうと、処理時間が増えたり、無限ループのような構造に入り込んだりしてしまうこともあります。
そのため、-Pを明示して「リンクは無視して本体だけを探す」ことで、安全で効率的な検索が可能になります。
8. findコマンドの-Pオプションと似たコマンドの比較
lsやduなど、他のLinuxコマンドでも「リンクを辿るかどうか」は重要な違いになります。
ls -lではリンク先が矢印(→)で表示されますし、du -Lではリンク先のサイズまで含まれます。
このように、Linuxのコマンドでは「リンクを辿るかどうか」は明示的に考える必要があります。findの場合も、-Pや-Lを使い分けることで、検索の精度が格段に上がります。