cp vs. cp -r bei symbolischen Links

cp vs. cp -r bei symbolischen Links

Ich habe vor Kurzem mit dem Befehl cp experimentiert und Folgendes festgestellt:
Nehmen wir an, wir haben einen Ordner foo, der die Datei barund den symbolischen Link enthält l-bar:

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

Beim Kopieren lbarmit dem Standard cp lbar copy-lbarerhalten wir

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

wobei copy-lbares sich um eine normale Datei handelt, die den Originalinhalt von enthält bar. copy-lbarSie ist in keiner Weise mit baroder verknüpft lbar. Wenn wir cp -r lbar copy-lbar-recursivestattdessen verwenden, erhalten wir Folgendes:

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

Jetzt stellt, genau wie lbar, copy-lbar-recursiveeinen Link zur Originaldatei dar bar.

Aber warum ändert die -r, --recursiveOption cpdie Art und Weise, wie Links kopiert werden?
Die Optionen helpund manualkennzeichnen cpes einfach als"Verzeichnisse rekursiv kopieren".
Was passiert intern, das -rsich anders auf einen symbolischen Link auswirkt?

Antwort1

Die vollständigeGNU-Dokumentation(aber nicht die Debian-Manpage, zum Beispiel) beschreibt das Verhalten wie folgt

Beim Kopieren von einem symbolischen Link folgt cp dem Link normalerweise nur, wenn nicht rekursiv kopiert wird oder wenn --link( -l) verwendet wird. Diese Vorgabe kann mit den Optionen --archive( -a), -d, --dereference( -L), --no-dereference( -P) und überschrieben werden -H.

Darin heißt es auch:

'--recursive' Verzeichnisse rekursiv kopieren. Standardmäßig werden symbolischen Links in der Quelle nicht gefolgt, es sei denn, sie werden zusammen mit der Option --link( -l) verwendet [...]

Die Verwendung von -r zum Kopieren symbolischer Links oder spezieller Dateien ist nicht portierbar. [...]

Darüber hinaus ist die Verwendung von -R zum Kopieren symbolischer Links nicht portierbar, sofern Sie nicht auch -P angeben, da POSIX Implementierungen zulässt, die symbolische Links standardmäßig dereferenzieren.

Um Ihre Frage direkt zu beantworten: Das Verhalten ist wie beschrieben, um ein Element der Standardverhaltenskompatibilität mit POSIX aufrechtzuerhalten.

verwandte Informationen