Ich habe vor Kurzem mit dem Befehl cp experimentiert und Folgendes festgestellt:
Nehmen wir an, wir haben einen Ordner foo
, der die Datei bar
und den symbolischen Link enthält l-bar
:
foo
|-- bar
|-- lbar -> bar
Beim Kopieren lbar
mit dem Standard cp lbar copy-lbar
erhalten wir
foo
|-- bar
|-- copy-lbar
|-- lbar -> bar
wobei copy-lbar
es sich um eine normale Datei handelt, die den Originalinhalt von enthält bar
. copy-lbar
Sie ist in keiner Weise mit bar
oder verknüpft lbar
. Wenn wir cp -r lbar copy-lbar-recursive
stattdessen verwenden, erhalten wir Folgendes:
foo
|-- bar
|-- copy-lbar
|-- copy-lbar-recursive -> bar
|-- lbar -> bar
Jetzt stellt, genau wie lbar
, copy-lbar-recursive
einen Link zur Originaldatei dar bar
.
Aber warum ändert die -r, --recursive
Option cp
die Art und Weise, wie Links kopiert werden?
Die Optionen help
und manual
kennzeichnen cp
es einfach als"Verzeichnisse rekursiv kopieren".
Was passiert intern, das -r
sich 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.