cp-L vs. cp-H

45

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 hier beschreibt beide Optionen als ähnlich, UNLESS in Kombination mit -R. Nicht für mich. Soft-as-Hardlink-Dateien werden in Kopien der Dateien umbenannt, auf die sie an der Quelle verweisen.
 

Frage :

Was ist der richtige Gebrauch von cp -Hund cp -L? Ist das das erwartete Verhalten?


  Mein Lösungsversuch : man cpsagt mir für beide Optionen dasselbe, aber info cpder Wortlaut macht es für mich noch verwirrender. Vielleicht kann man mir helfen, das ein bisschen aufzuschlüsseln:

-H Wenn ein Befehlszeilenargument eine symbolische Verknüpfung angibt, kopieren Sie die Datei, auf die es verweist, und nicht die symbolische Verknüpfung selbst. Kopieren Sie jedoch alle symbolischen Verknüpfungen , die durch rekursives Durchlaufen auftreten (wobei die Natur der Verknüpfung erhalten bleibt).

Das klingt für mich wie ein Widerspruch: Ich denke, dass » die Natur eines symbolischen Links « ist, dass es irgendwo hinweist…

-L, --dereference Folgen Sie beim Kopieren symbolischen Links. Mit dieser Option cpkann keine symbolische Verknüpfung erstellt werden. Beispielsweise wird ein Symlink (zu einer regulären Datei) im Quellbaum in eine reguläre Datei im Zielbaum kopiert.

Ich weiß, dass ein Symlink keine reguläre Datei ist, aber… ich gebe zu, dass ich mit dieser Erklärung hier überfordert bin.

erch
quelle
Laufen info cp, suchen nach -R. Es heißt Copy directories recursively. aber Sie testen mit Nicht-Verzeichnissen. Der Unterschied besteht darin, was sich in den Verzeichnissen befindet, die Sie kopieren, und nicht in den Befehlszeilenargumenten.
Mikel
@Mikel Ich habe versucht, den Inhalt von Verzeichnissen zu kopieren und die Verzeichnisse mit dem Inhalt selbst zu kopieren und habe ziemlich die gleichen Ergebnisse erzielt. Außerdem: Ich saß ziemlich lange vor info cpund versuchte herauszufinden, was die Wortwahl bei dieser Option tatsächlich bedeutet & ndash; und worum es in diesem Beitrag geht. Das Posting enthält auch den eigentlichen Wortlaut von info cp- also muss ich ihn zumindest geöffnet haben…;)
Erch

Antworten:

55

Mit Symlinks haben Tools zwei Möglichkeiten:

  1. Behandle den Symlink als Symlink ("seine Natur bewahren"), oder
  2. Behandeln Sie den Symlink 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 deren Inhalt in den Zieldateinamen kopiert. Die Quelle war also ein Symlink, aber ihre Kopie ist kein Symlink. So "verlor es seine Natur als Symlink".

Erwägen

$ 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  
Mikel
quelle
Tolle Antwort - ich finde es toll, wie Sie die Möglichkeiten veranschaulichen. Meine Frage, nämlich das Kopieren von Symlinks in Geschwisterverzeichnisse, ist nicht ganz beantwortet , aber Sie haben deutlich gemacht, wie ich ein schnelles Experiment durchführen kann, um dies herauszufinden. 😉
Michael Scheper
1
Ah, es stellte sich heraus, dass ich Folgendes unbedingt wissen wollte: superuser.com/a/138594/219388
Michael Scheper
19

Der Unterschied im Verhalten zwischen -Lund -Hkommt, wenn -rangegeben wird. cpErstellt keine Symlinks in Unterverzeichnissen mit, -L -raber es wird, wenn Sie verwenden -H -r.

Kyle Jones
quelle
cp: Die Optionen -H, -L und -P dürfen nicht mit der Option -r angegeben werden.
8.