2.4.1 シンボリックリンク
シンボリックリンクは、ほかのファイルを参照する名前です。GNU findは、シンボリックリンクを2つの方法のいずれかで扱います。1つ目は、リンクをたどる方法です。シンボリックリンクに出会うと、そのリンクが指すファイルを調べ、指定した条件に一致するかどうかを確認します。2つ目は、リンクそのものを探している場合に、リンク自体を調べる方法です。リンク先のファイルもfindで検索するディレクトリ階層内にある場合は、この2つの方法の違いがあまり目立たないこともあります。
既定では、findは見つけたシンボリックリンクそのものを調べます。後でリンク先のファイルに出会えば、それも調べます。findでリンクをたどり、各リンクが指すファイルを調べたい場合は、findに「-L」オプションを指定してください。「-P」で既定の動作を明示することもできます。「-H」は中間的なオプションで、コマンド行に列挙したシンボリックリンクだけをたどり、それ以外はたどりません。列挙したものには、検索するファイルの一覧や、「-newer」のようなテストで指定したものが含まれます。
シンボリックリンクは、リンクをたどるために、リンク先のファイル名に含まれるディレクトリを検索する権限が必要な点で、ハードリンクと異なります。そのため、「-L」を指定しても、権限が不足していると、findはリンク先ファイルの属性を判断できない場合があります。その場合、findはリンクそのものの属性を使います。リンク先のファイルが存在しない場合や、リンクが直接または間接的に自分自身を指している場合も同様です。
リンクに関するfindの動作を制御するオプションは、次のとおりです。
- ‘-P’
findはシンボリックリンクをまったくたどりません。これが既定の動作です。このオプションは、コマンド行のファイル名より前に指定する必要があります。- ‘-H’
findは、コマンド行にあるファイル名を除いて、シンボリックリンクをたどりません。コマンド行のファイル名についてはたどります。たどれない場合は、シンボリックリンクそのものの情報を使います。このオプションは、コマンド行のファイル名より前に指定する必要があります。- ‘-L’
findは、可能であればシンボリックリンクをたどり、不可能な場合はリンクそのものの属性を使います。このオプションは、コマンド行のファイル名より前に指定する必要があります。また、このオプションを使うと、「-noleaf」と同じ動作も有効になります。後から「-H」や「-P」を使っても、「-noleaf」の効果は無効になりません。findの実行中にシンボリックリンクを壊す可能性がある「-delete」などのアクションは、紛らわしい動作を引き起こす場合があります。たとえば、「find -L . -type d -delete」は空のディレクトリを削除します。しかし、あるサブツリーがディレクトリとディレクトリへのシンボリックリンクだけを含む場合でも、削除に失敗することがあります。リンク先を削除するとシンボリックリンクが壊れ、壊れたリンクに対しては「-type d」が偽になるためです。
- ‘-follow’
このオプションは式の一部なので、ファイル名より後に指定する必要があります。それ以外は「-L」と同等です。「-follow」は、コマンド行でそれより後にあるテストだけに影響します。このオプションは非推奨です。可能であれば、代わりに「-L」を使ってください。
「-L」を使うと、次のような動作の違いがあります。
findは、ディレクトリツリーを検索するとき、ディレクトリへのシンボリックリンクをたどります。- 「-lname」と「-ilname」は、壊れたシンボリックリンクに一致する場合を除き、常に偽を返します。
- 「-type」は、シンボリックリンクが指すファイルの種類を報告します。そのため、「-L」と組み合わせた場合、「-type l」が真になるのは壊れたシンボリックリンクだけです。「-L」を指定したときにシンボリックリンクを調べるには、「-xtype l」を使ってください。
- 「-noleaf」の動作も有効になります(ディレクトリを参照)。
「-L」または「-H」を使う場合、「-newer」「-anewer」「-cnewer」の引数に指定したファイル名についてはシンボリックリンクをたどり、可能であればリンク先のタイムスタンプを使います。不可能であれば、リンクのタイムスタンプを使います。
- テスト: -lname pattern
- テスト: -ilname pattern
ファイルがシンボリックリンクで、その内容がシェルパターンpatternに一致すると真になります。「-ilname」では大文字と小文字を区別しません。pattern引数の詳細については、シェルのパターンマッチングを参照してください。「-L」が有効な場合、壊れたシンボリックリンクを除いて、このテストは常に偽を返します。そのため、現在のディレクトリとそのサブディレクトリにある、sysdep.cへのシンボリックリンクを列挙するには、次のようにします。
find . -lname '*sysdep.c'