Worin unterscheidet sich cp -f von cp --remove-destination?

Worin unterscheidet sich cp -f von cp --remove-destination?

In der Manpage von cp wird die Option -f/--force wie folgt aufgelistet: Wenn eine vorhandene Zieldatei nicht geöffnet werden kann, entfernen Sie sie und versuchen Sie es erneut.

für die Option --remove-destination heißt es: Entfernen Sie jede vorhandene Zieldatei, bevor Sie versuchen, sie zu öffnen (im Gegensatz zu --force).

Ersteres prüft also zuerst, ob die Datei geöffnet werden kann, und löscht sie, wenn nicht, trotzdem, während Letzteres diesen Schritt einfach überspringt. Ich habe beide mit der Option -i kombiniert, und in beiden Fällen wird angezeigt, welche Berechtigungen die Dateien haben, wenn sie schreibgeschützt sind.

Letzteres scheint effizienter zu sein, insbesondere beim rekursiven Kopieren/Überschreiben großer Verzeichnisse, aber warum sollte man beide Optionen beibehalten? Was ist der Vorteil, etwas zu prüfen, das ohnehin überschrieben wird?

Antwort1

Es gibt einen Unterschied zwischen den beiden (Hervorhebung von mir):

WennEine vorhandene Zieldatei kann nicht geöffnet werden. Entfernen Sie sie und versuchen Sie es erneut.
Entfernen Sie alle vorhandenen Zieldateien.bevor Sie versuchen, es zu öffnen

Im ersten Fall cpwird versucht, nur den Inhalt zu ersetzen, wenn die Datei geöffnet werden kann. cpDie Datei wird nicht unnötig entfernt. Dadurch bleiben die Berechtigungen und Eigentümer der Originaldatei erhalten, sofern Sie nicht angeben, dass diese ebenfalls kopiert werden sollen.

Der zweite Fall ist nützlich, wenn der Inhalt nicht gelesen werden kann (wie z. B.baumelnde symbolische Links).

Antwort2

und: falls die Zieldatei mehrere Links (Hardlinks) hat, wird mit --remove-destination der Inhalt der anderen Links nicht zerstört. Stattdessen wird nur der Link des Ziels entfernt (jetzt wissen wir, warum "remove" in tieferen Systemfunktionen "unlink" heißt) und eine neue Datei mit einem neuen Inode erstellt.

verwandte Informationen