最近、cp コマンドを試してみたところ、次のことに気付きました。ファイルとシンボリック リンクを含む
フォルダーがあると仮定します。foo
bar
l-bar
foo
|-- bar
|-- lbar -> bar
lbar
デフォルトを使用してコピーするとcp lbar copy-lbar
、
foo
|-- bar
|-- copy-lbar
|-- lbar -> bar
ここで、 はcopy-lbar
通常のファイルであり、 の元のコンテンツが含まれていますbar
。は、copy-lbar
または にリンクされていません。 代わりに を使用すると、次のようになります。bar
lbar
cp -r lbar copy-lbar-recursive
foo
|-- bar
|-- copy-lbar
|-- copy-lbar-recursive -> bar
|-- lbar -> bar
ここで、 と同様にlbar
、copy-lbar-recursive
は元のファイルへのリンクを表しますbar
。
しかし、なぜ-r, --recursive
オプションはcp
リンクのコピー方法を変更するのでしょうか?
両方のフラグはhelp
、manual
cp
「ディレクトリを再帰的にコピーする」シンボリック リンクに異なる影響を与える
内部的な出来事は何でしょうか?-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 とのデフォルトの動作互換性の要素を維持するために説明されているとおりになります。