cp -f と cp --remove-destination の違いは何ですか?

cp -f と cp --remove-destination の違いは何ですか?

cpのマニュアルページでは、-f/--forceオプションは次のように記載されています: 既存の宛先ファイルを開けない場合は、それを削除して再試行してください

--remove-destination オプションの場合、次のように表示されます: 既存の宛先ファイルを開こうとする前に、それを削除します (--force とは対照的)

つまり、前者はまず開くことができるかどうかを確認し、開けない場合はとにかく削除しますが、後者はそのステップを単にバイパスします。それぞれを -i オプションと組み合わせると、どちらの場合も、書き込み禁止になっているファイルの権限が示されます。

後者は、特に大規模なディレクトリを再帰的にコピー/上書きする場合に、より効率的であるように思われますが、なぜ両方のオプションを維持するのでしょうか? いずれにせよ上書きするものをチェックする利点は何でしょうか?

答え1

これら 2 つには違いがあります (強調は筆者による):

もし既存の宛先ファイルを開くことができない場合は、それを削除して再試行してください。
既存の宛先ファイルをそれぞれ削除してください。開ける前に

最初のケースでは、ファイルを開くことができる場合、cp内容のみを置き換えようとします。cp不必要にファイルを削除することはありません。元のファイルの権限と所有権もコピーするように指定しない限り、それらは保持されます。

2番目のケースは、コンテンツが読み取れない場合に便利です(例:ぶら下がっているシンボリックリンク)。

答え2

また、宛先ファイルに複数のリンク (ハードリンク) がある場合、--remove-destination は他のリンクの内容を破壊しません。代わりに、宛先のリンクのみが削除され (これで、より深いシステム関数で「remove」が「unlink」と呼ばれる理由がわかりました)、新しい inode を持つ新しいファイルが作成されます。

関連情報