cp -L im Vergleich zu cp -H

cp -L im Vergleich zu cp -H

Problem

Beim Kopieren von Dateien mit cp -Hoder cp -Lerhalte 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 -Hund cp -L? Ist dies das erwartete Verhalten?


  Mein Lösungsversuch: man cpsagt 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 Option cpkann 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:

  1. Behandeln Sie den Symlink als Symlink („unter Beibehaltung seiner Natur“) oder
  2. 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 cpgeö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 -Lund tritt auch -Hauf, wenn angegeben wird. erstellt mit keine symbolischen Links in Unterverzeichnissen, aber wenn Sie verwenden .-rcp-L -r-H -r

verwandte Informationen