シンボリックリンクでの cp と cp -r

シンボリックリンクでの cp と cp -r

最近、cp コマンドを試してみたところ、次のことに気付きました。ファイルとシンボリック リンクを含む
フォルダーがあると仮定します。foobarl-bar

foo
|-- bar
|-- lbar -> bar

lbarデフォルトを使用してコピーするとcp lbar copy-lbar

foo
|-- bar
|-- copy-lbar
|-- lbar -> bar

ここで、 はcopy-lbar通常のファイルであり、 の元のコンテンツが含まれていますbar。は、copy-lbarまたは にリンクされていません。 代わりに を使用すると、次のようになります。barlbarcp -r lbar copy-lbar-recursive

foo
|-- bar
|-- copy-lbar
|-- copy-lbar-recursive -> bar
|-- lbar -> bar

ここで、 と同様にlbarcopy-lbar-recursiveは元のファイルへのリンクを表しますbar

しかし、なぜ-r, --recursiveオプションはcpリンクのコピー方法を変更するのでしょうか?
両方のフラグはhelpmanualcp「ディレクトリを再帰的にコピーする」シンボリック リンクに異なる影響を与える
内部的な出来事は何でしょうか?-r

答え1

完全なGNUドキュメント(ただし、Debianのmanページには記載されていない)この動作は次のように説明されている。

--linkシンボリック リンクからコピーする場合、cp は通常、再帰的にコピーしていない場合、または( ) が使用されている場合にのみリンクをたどります。このデフォルトは、 ( )、、( ) 、( )、およびオプション-lで上書きできます。--archive-a-d--dereference-L--no-dereference-P-H

また、次のようにも書かれている。

'--recursive--link' ディレクトリを再帰的にコピーします。デフォルトでは、 ( -l) オプションと一緒に使用しない限り、ソース内のシンボリック リンクをたどりません[...]

-r を使用してシンボリック リンクまたは特殊ファイルをコピーすることは移植性がありません。 [...]

また、POSIX ではデフォルトでシンボリック リンクを逆参照する実装が許可されているため、-P も指定しない限り、-R を使用してシンボリック リンクをコピーすることは移植性がありません。

したがって、質問に直接答えると、動作は、POSIX とのデフォルトの動作互換性の要素を維持するために説明されているとおりになります。

関連情報