Kopieren Sie symlink AND, wo es auf die Verwendung von rsync verweist

11

Es muss nicht von gemacht werden rsync, aber es wäre schön, kein Skript schreiben zu müssen, um dies zu tun, und es rsyncist sehr nah an dem, was ich will.

rsync -a(oder -l) kann Symlinks beibehalten und Symlinks -Ldereferenzieren und kopieren, als ob es sich um eine normale Datei / ein normales Verzeichnis handelt. Ist es jedoch möglich, den Symlink beizubehalten und auch die Dateien / Verzeichnisse zu kopieren, auf die die Links verweisen?

Hier ist ein Beispiel. Angenommen, wir haben diese Ordnerhierarchie:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

und wenn ich es tue rsync -aR dirA dest(oder etwas anderes), möchte ich genau diese in dest:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

Ist das möglich mit rsync? Vielen Dank.

Nehmen wir an, dass Symlinks mit einem absoluten Pfad oder einem Hinweis außerhalb des Quellverzeichnisses ignoriert werden können.

Wei-Yin
quelle
1
Ich denke, Ihre Anfrage ist nicht genau spezifiziert: Sie benötigen, dass, wenn dirA/linkes sich um einen Symlink zu handelt ../dirB/file, dies als Kopieren dirB/filenach dest/dirB/fileund dirA/linknach behandelt werden sollte dest/dirA/link. Was ist, wenn dirA/linkein Link zu ist ../../another_file? Was passiert im Allgemeinen, wenn dirA/linkauf ein Verzeichnis verwiesen wird, das sich weiter oben im Verzeichnisbaum befindet?
Riccardo Murri
Guter Fang. In meinem Anwendungsfall gibt es keinen Verknüpfungspunkt außerhalb des Baums und keinen absoluten Pfad in den Verknüpfungen.
Wei-Yin
1
Je mehr ich darüber nachdenke, desto mehr denke ich, dass kein Standarddienstprogramm dies tun wird. Im allgemeinen Fall, könnte es braucht eine große Anzahl von Zielen aus einer Hand gegeben erstellen, wenn Sie einen symbolischen Link zu einem Symlink haben oder allgemeiner einen Symlink , dessen Ziel enthält einen symbolischen Link (zB a -> b, b -> c/foo, c -> d/e: eine Anforderung an Kopie aauch kopieren soll b, c, c/foo, d, d/eund d/e/foo).
Gilles 'SO - hör auf böse zu sein'
@ Gilles: Ja, du hast recht. Das Verfolgen von Links kann dazu führen, dass viele Dateien aufgenommen werden, solange sie sich noch im Quellverzeichnis befinden.
Wei-Yin

Antworten:

2

Wenn Sie den Symlink-Namen kennen und den Link und das Ziel übertragen möchten, können Sie:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

Der erste rsyncüberträgt nur die symlink. Der zweite Befehl findet den tatsächlichen Verzeichnisnamen und der zweite rsyncüberträgt den Verzeichnisinhalt.

user201564
quelle
0

Dies wäre nur dann möglich, wenn Sie alle in 'mydir' wären und 'mydir' von einem Ort zum anderen synchronisieren würden. Rsync kann nicht außerhalb des von Ihnen angegebenen Pfads kopieren (mit Ausnahme der folgenden Links). z.B

mydir/dirA ...
mydir/dirB ...
...
Xenoterracid
quelle
Ja, diese Annahme passt zu meinem Anwendungsfall. Alle Links befinden sich in mydir.
Wei-Yin
@ Wei-Yin dann einfach sagen, es nicht folgen Symlinks ... oder habe ich etwas falsch verstanden
Xenoterracide
@xenoterracide: Unabhängig davon, wie Sie rsync aufrufen, wird meiner Meinung nach für jede Quelle ein einziges Ziel erstellt (außer für die Erstellung führender Verzeichnisse). Aber Wei-Yin möchte zwei oder mehr Ziele erstellen: die Verbindung und ihr Ziel.
Gilles 'SO - hör auf böse zu sein'
anscheinend bin ich verwirrt ...
Xenoterracide
@ Gilles: Es ist nicht erforderlich, dass rsync dem Symlink folgt, da das Ziel trotzdem synchronisiert wird . Es kopiert also zuerst den Symlink und erstellt einen baumelnden Symlink. Anschließend wird alles andere im Verzeichnis kopiert, einschließlich des Ziels des Symlinks. Voila, alles passt gut zusammen.
Martin v. Löwis