シンボリックリンクの 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含む一般的なファイルは、または。代替アプローチを使用すると、次のような結果が得られます。barcopy-lbarbarlbarcp -r lbar copy-lbar-recursive

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

これで、元のファイルを表すリンクlbarと同じです。copy-lbar-recursivebar

しかし、リンクコピー方法のオプションを変更したいのはなぜですか-r, --recursive?この2つの合計は、単に次のように表示されます。cp
helpmanualcp「再帰的にディレクトリをコピー」。内部的にシンボリックリンクに異なる影響を与えるために
何が起こっていますか?-r

答え1

完璧GNUドキュメント(たとえば、Debianのマンページではありません)次の動作について説明します。

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

それも書いた、

'--recursive'ディレクトリを再帰的にコピーします。デフォルトでは、--link()オプション[...]-lで使用されていない限り、ソースコードからシンボリックリンクをたどらないでください。

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

また、-R を使用してシンボリックリンクをコピーすることは、-P も指定しない限り移植可能ではありません。 POSIXでは、基本的にシンボリックリンクを逆参照する実装を許可しているからです。

したがって、あなたの質問に直接答えるためにPOSIXの基本的な動作との互換性要素を維持するための動作が説明されています。

関連情報