
Angenommen, wir haben in unserem Verzeichnis einen Pfad wie:
a/b/c/d/e
wobei es c
sich eigentlich um einen symbolischen Link handelt,
a/b/c -> f
Und f
enthält d/e
.
Wenn ich es dann rsync -avzR
ohne das --copy-unsafe-links
Flag ausführe, wird trotzdem dieser „unsichere“ Link kopiert.
Erwartet:
a/b/c->f
f/d/e
wenn ich laufe rsync -avzR a/b/c/d/e some_dir
.
Tatsächliche Ausgabe:
a/b/c/d/e
Wie kann ich auf diese Weise die erwartete Ausgabe erhalten?
Antwort1
Proman rsync
(meine Hervorhebung):
-R, --relative
Verwenden Sie relative Pfade. Dies bedeutet, dass die vollständigen Pfadnamen, die in der Befehlszeile angegeben wurden, an den Server gesendet werden und nicht nur die letzten Teile der Dateinamen. [Wenn] Sie
rsync -avR /foo/bar/baz.c remote:/tmp/
dann wird auf dem Remote-Rechner eine Datei mit dem Namen /tmp/foo/bar/baz.c erstellt, wobei der vollständige Pfad erhalten bleibt. Diese zusätzlichen Pfadelemente heißen"implizierte Verzeichnisse"(d. h. die Verzeichnisse „foo“ und „foo/bar“ im obigen Beispiel).
Beginnend mit rsync 3.0.0,rsync sendet diese impliziten Verzeichnisse immer als echte Verzeichnisse in der Dateiliste, auch wenn ein Pfadelement auf der sendenden Seite tatsächlich ein symbolischer Link ist. Dies verhindert einige wirklich unerwartete Verhaltensweisen beim Kopieren des vollständigen Pfads einer Datei, von der Sie nicht wussten, dass sie einen symbolischen Link in ihrem Pfad hat. Wenn Sie einen serverseitigen symbolischen Link duplizieren möchten, schließen Sie sowohl den symbolischen Link über seinen Pfad als auch das Referenzverzeichnis über seinen tatsächlichen Pfad ein. Wenn Sie auf der Sendeseite mit einem älteren rsync arbeiten, müssen Sie möglicherweise die
--no-implied-dirs
Option verwenden.
Das von Ihnen erlebte Verhalten ist also zu erwarten.
Wie kann man das überwinden? Ich habe es nicht getestet, aber ich denke, eine praktikable Problemumgehung wäre etwa folgende:
mkdir -p some_dir/a/b
rsync -avz a/b/ some_dir/a/b # Trailing slash after first 'b'
rsync -avz a/b/c/f some_dir # No trailing slash after 'f'
Ich empfehle auch die Lektüre desSYMBOLISCHE LINKSAbschnitt der rsync
Manpage.
Antwort2
Ich kann Ihr Verhalten nicht reproduzieren. Ich habe ein Skript erstellt, das ein Verzeichnis einrichtet und es dann kopiert. Es enthält einen relativen und einen absoluten Symlink. Mit den Optionen, die Sie anzeigen ( -avzR
), sollte es nicht in eines von beiden absteigen, sondern den Link als Link kopieren.
Ich nehme an, dass ich einen Aspekt Ihres Versuchs falsch interpretiert habe. Sie können also Ihrer Frage etwas hinzufügen, wenn Sie wissen, was das ist, oder Sie können dieses Skript ausführen und prüfen, ob Ihr Verhalten anders ist als das, was ich zeige.
Skript:
#!/bin/sh
SRC=/tmp/syncsrc
DEST=/tmp/syncdest
rm -rf $SRC $DEST
mkdir -p $SRC/a/b
mkdir -p $SRC/f/d
touch $SRC/f/d/e
ln -s ../../f $SRC/a/b/c
ln -s $SRC/f $SRC/a/b/g
mkdir $DEST
rsync -avzRi $SRC/a $DEST
Ausgabe
sending incremental file list
cd+++++++++ /tmp/
cd+++++++++ /tmp/syncsrc/
cd+++++++++ /tmp/syncsrc/a/
cd+++++++++ /tmp/syncsrc/a/b/
cL+++++++++ /tmp/syncsrc/a/b/c -> ../../f
cL+++++++++ /tmp/syncsrc/a/b/g -> /tmp/syncsrc/f
Und das Ziel wird mit den darin enthaltenen Symlinks erstellt
$ find /tmp/syncdest \( -type l -printf '%h/%f -> %l\n' \) -o -printf '%h/%f\n'
/tmp/syncdest
/tmp/syncdest/tmp
/tmp/syncdest/tmp/syncsrc
/tmp/syncdest/tmp/syncsrc/a
/tmp/syncdest/tmp/syncsrc/a/b
/tmp/syncdest/tmp/syncsrc/a/b/c -> ../../f
/tmp/syncdest/tmp/syncsrc/a/b/g -> /tmp/syncsrc/f