シンボリック リンクは、リンク先のものとして、またシンボリック リンクとして扱われるのはいつですか?
シンボリックリンクは、異なるタイプのファイルにリンクできます。たとえば、mylk
ディレクトリにリンクするシンボリックリンクがあるとします。次の 2 つは異なる動作をします。
mv mylk ~
mv mylk/ ~
シンボリックがリンク先として扱われるか、またはそれ自体として扱われるかは、コマンドによって期待される内容、または指定方法 (リンクを使用するコマンドに関係なく) によって決まりますか? ありがとうございます。
答え1
ファイルの内容を操作するプログラムは、シンボリック リンクではなく、常にターゲットに対して操作を行います。これは、シンボリック リンク自体には内容がないためです。
ファイルのメタデータ (タイムスタンプ、所有者、権限など) を操作するプログラムは通常はターゲットに対して操作しますが、一部のプログラムにはシンボリック リンクに対して操作するオプションがあります (たとえば、、などchown -h
) touch -h
。
ディレクトリエントリを操作するプログラムは、通常、シンボリックリンクに対して操作を行います。名前の変更や削除などの操作は、ディレクトリエントリが何であれ、ディレクトリエントリに対して行われます。プログラムがシンボリックリンクをたどるかどうかに応じて、ファイルのメタデータ(ファイルタイプを含む)にアクセスするための個別のシステムコールがあります(stat
) か否か (lstat
)。任意のタイプのディレクトリ エントリに作用できるプログラムの中には、リンクを見つけたときにリンクではなくターゲットに作用するように指示するオプションを持つものがあります。たとえば、ディレクトリを再帰的にトラバースする多くのユーティリティ ( find
、、、…) は、デフォルトでシンボリック リンクに作用しますが、オプション を渡すとすべてのシンボリック リンクをたどり、オプション を渡すとコマンド ラインのシンボリック リンクをたどりますが、再帰トラバース中に見つかったディレクトリへのシンボリック リンクはたどりません。chown -R
cp -R
-L
-H
ファイル名の末尾にスラッシュがある場合は、ファイル名はディレクトリとして解釈されます。名前がシンボリックリンクの場合は、それがたどられます。したがって、シンボリックリンクかそうでないかに関係なく、mv mylk ~
は移動しますが、ディレクトリの場合は移動し、ディレクトリへのシンボリックリンクの場合はターゲットを移動し、ディレクトリでもシンボリックリンクでもない場合はエラーを出力します。この一般的な動作mylk
mv mylk/ ~
mylk
mylk
mylk