
Problem
Beim Kopieren von Dateien mit cp -H
oder cp -L
erhalte ich die gleichen Ergebnisse:
$ ls -l fileA
fileA -> fileB
$ cp fileA somewhere/ -H
$ ls -l somewhere/
fileA # fileA is a copy of fileB, only renamed, with same properties!
Diese Antwort hierbeschreibt beide Optionen als ähnlich, AUSSER sie werden in Kombination mit verwendet -R
. Nicht für mich. Soft-, da fest verknüpfte Dateien umbenannte Kopien der Dateien werden, auf die sie an der Quelle verweisen.
Frage:
Was ist die ordnungsgemäße Verwendung von cp -H
und cp -L
? Ist dies das erwartete Verhalten?
Mein Lösungsversuch:
man cp
sagt mir für beide Optionen ziemlich das Gleiche, aber info cp
'sWortlautmacht es für mich noch verwirrender. Vielleicht kann mir jemand helfen, das ein wenig aufzuschlüsseln:
-H
Wenn ein Befehlszeilenargument einen symbolischen Link angibt, dannkopieren Sie die Datei, auf die es verweist, und nicht den symbolischen Linkselbst. AllerdingsKopieren (unter Beibehaltung der Natur) eines beliebigen symbolischen Linksdas durch rekursives Durchlaufen angetroffen wird.
Das klingt für mich wie ein Widerspruch: Ich vermute, dass »die Natur eines symbolischen Links„ist, dass es irgendwohin zeigt…
-L, --dereference
Folgen Sie symbolischen Links, wenn Sie von ihnen kopieren. Mit dieser Optioncp
kann kein symbolischer Link erstellt werden. Beispielsweise wird ein symbolischer Link (zu einer normalen Datei) im Quellbaum in eine normale Datei im Zielbaum kopiert.
Ich weiß, dass ein symbolischer Link keine normale Datei ist, aber … ich gebe zu, dass ich mit dieser Erklärung hier überfordert bin.
Antwort1
Mit symbolischen Links können Tools zwei Dinge tun:
- Behandeln Sie den Symlink als Symlink („unter Beibehaltung seiner Natur“) oder
- Behandeln Sie den symbolischen Link als den Dateityp, auf den er verweist.
Zu sagen, dass -H
„seine Natur bewahrt“ ist kein Widerspruch. Betrachten Sie die Alternative. Wenn Sie verwenden -L
, werden alle gefundenen Symlinks cp
geöffnet und ihr Inhalt in den Zieldateinamen kopiert. Die Quelle war also ein Symlink, aber ihre Kopie ist kein Symlink. Sie „verlor also ihre Natur als Symlink“.
In Betracht ziehen
$ mkdir subdir
$ echo "some contents" > subdir/file
$ ln -s file subdir/link
# definition of "list", the abbreviated ls -l output used below
$ list() { ls -l "$@" | \
awk '$0 !~ /^total/ { printf "%s %s\t%s %s %s\n", $1, $5, $9, $10, $11 }' ; }
$ list subdir
-rw-rw-r-- 14 file
lrwxrwxrwx 4 link -> file
$ cp -rH subdir subdir-with-H
$ list subdir-with-H
-rw-rw-r-- 14 file
lrwxrwxrwx 4 link -> file
$ cp -rL subdir subdir-with-L
$ list subdir-with-L
-rw-rw-r-- 14 file
-rw-rw-r-- 14 link
Antwort2
Der Unterschied im Verhalten zwischen -L
und tritt auch -H
auf, wenn angegeben wird. erstellt mit keine symbolischen Links in Unterverzeichnissen, aber wenn Sie verwenden .-r
cp
-L -r
-H -r