it-swarm.com.de

rsync - Alle fehlenden übergeordneten Verzeichnisse erstellen?

Ich suche ein rsync-ähnliches Programm, das alle fehlenden übergeordneten Verzeichnisse auf der Remote-Seite erstellt.

Wenn ich zum Beispiel /top/a/b/c/d Auf einem Server habe und nur /top/a Auf dem Remote-Server vorhanden ist, möchte ich d auf den Remote-Server kopieren und habe das b und c Verzeichnisse erstellt.

Der Befehl:

rsync /top/a/b/c/d remote:/top/a/b/c

funktioniert nicht, weil /tmp/a/b auf dem Remote-Server nicht vorhanden ist. Und wenn es existiert, wird die Datei d in den Pfad /top/a/b/c Kopiert.

Dies ist mit rsync unter Verwendung der Schalter --include Und --exclude Möglich, ist jedoch sehr aufwendig, z.

rsync -v -r a dest:dir  \
  --include 'a/b'       \
  --include 'a/b/c'     \
  --include 'a/b/c/d'   \
  --include 'a/b/c/d/e' \
  --exclude 'a/*'       \
  --exclude 'a/b/*'     \
  --exclude 'a/b/c/*'   \
  --exclude 'a/b/c/d/*' 

kopiert nur a/b/c/d/e nach dest:dir/a/b/c/d/e, auch wenn die Zwischenverzeichnisse Dateien enthalten. (Hinweis: Die Includes müssen vor den Exclusives stehen.)

Gibt es noch andere Möglichkeiten?

36
ErikR

Möglicherweise suchen Sie nach

rsync -aR

beispielsweise:

rsync -a --relative /top/a/b/c/d remote:/

Siehe auch diesen Trick in andere Frage .

18
Balu
rsync -aq --rsync-path='mkdir -p /tmp/imaginary/ && rsync' file [email protected]:/tmp/imaginary/

Von http://www.schwertly.com/2013/07/forcing-rsync-to-create-a-remote-path-using-rsync-path/ , aber nicht kopieren und einfügen von dort wird seine Syntax abgeschlachtet.

mit diesem Befehl können Sie einen beliebigen Befehl ausführen, um den Pfad für ausführbare rsync-Dateien einzurichten.

13
Eddie

ich schlage vor, dass Sie die Existenz manuell erzwingen:

ssh [email protected] mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c

dadurch wird der Zielordner erstellt, sofern er noch nicht vorhanden ist.

7
mnagel

Laut https://unix.stackexchange.com/a/496181/578 funktioniert --relative Seit rsync 2.6.7, wenn Sie . Zum Verankern des Startverzeichnis, das am Ziel erstellt werden soll:

[email protected]:~/projects/rsync$ mkdir --parents top1/a/b/c/d
[email protected]:~/projects/rsync$ mkdir --parents top2/a
[email protected]:~/projects/rsync$ rsync --recursive --relative --verbose top1/a/./b/c/d top2/a/
sending incremental file list
b/
b/c/
b/c/d/

sent 99 bytes  received 28 bytes  254.00 bytes/sec
total size is 0  speedup is 0.00
1
Derek Mahar

Ich suchte nach einer besseren Lösung, aber meine scheint besser geeignet zu sein, wenn Sie zu viele Unterverzeichnisse haben, um sie manuell zu erstellen.

Verwenden Sie einfach cp als Zwischenschritt mit dem --parents Möglichkeit

cp --parents /your/path/sub/dir/ /tmp/localcopy
rsync [options] /tmp/localcopy/* remote:/destination/path/

cp --parents erstellt die Struktur für Sie.

Sie können es von jedem Unterordner aus aufrufen, wenn nur eine Untermenge der übergeordneten Ordner kopiert werden soll.

1
jesseme

--relative funktioniert bei mir nicht, da ich andere Einstellungen hatte. Vielleicht habe ich einfach nicht verstanden, wie --relative funktioniert, aber ich habe festgestellt, dass die

ssh remote mkdir -p /top/a/b/c
rsync /top/a/b/c/d remote:/top/a/b/c

ist leicht zu verstehen und erledigt die Arbeit.

1
andrej