2013-08-28 6 views
26

Ich suche nach einem rsync -ähnlichen Programm, das alle fehlenden übergeordneten Verzeichnissen auf der Remote-Seite schaffen.rsync - alle fehlenden übergeordneten Verzeichnisse erstellen?

Zum Beispiel, wenn ich /top/a/b/c/d auf einem Server haben und nur /top/a existiert auf dem Remote-Server, möchte ich d auf dem Remote-Server kopieren und haben die b und c Verzeichnisse als auch erstellt.

Der Befehl:

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

wird nicht funktionieren, weil /tmp/a/b nicht auf dem Remote-Server vorhanden sein. Und wenn es nicht gibt dann die Datei d würde /top/a/b/c auf den Weg bekommen kopiert.

Dies ist möglich mit rsync mit --include und --exclude Schaltern zu tun, aber es ist sehr aufwendig, z.B .:

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-dest:dir/a/b/c/d/e auch wenn die Zwischenverzeichnisse Dateien. (Hinweis - das schließt muss die ausschließt vorangestellt werden.)

Gibt es noch andere Optionen?

+0

Siehe auch [rsync: Wie kann ich es konfigurieren, Zielverzeichnis auf dem Server zu erstellen?] (Http://stackoverflow.com/questions/1636889/rsync-how-can-i-configure-it-to-create- target-directory-on-server) – mivk

+0

Mögliches Duplikat von [So erzwingen Sie rsync, um den Zielordner zu erstellen] (https://stackoverflow.com/questions/9242135/how-to-force-rsync-to-create-destination-folder) – user

Antwort

4

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 

dies schafft den Zielordner, wenn es nicht bereits vorhanden ist.

+2

Ja - das ist ein Weg, es zu tun. Aber es scheint, dass mein Anwendungsfall ein so nützliches Szenario ist, dass es einen Befehl dafür oder einige Optionen für rsync geben sollte. – ErikR

+1

Mir ist keine solche Flagge bekannt. – mnagel

13

Sie können für

rsync -aR 

zum Beispiel suchen:

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

Siehe auch diesen Trick in other question.

+2

Warum auch "-a"? Ich bin mir ziemlich sicher, dass es nicht benötigt wird. –

+1

@KennyEvitt '-a' verwendet rekursives (' -r') aber nicht relatives ('-R'), also wird '-a' manchmal benötigt, um Besitzer/Dauer (' -aR') zu erhalten. Sie können es testen, wenn Sie rsync als root (oder einen anderen Benutzer) ausführen, um dieses Verhalten zu sehen. – dhaupin

+1

'--relative' wird nicht _create_ fehlen Verzeichniskomponenten auf der entfernten Seite wie in der Frage. – juzzlin

1

--relative ist für mich nicht funktionieren, da ich verschiedene Setup hatte. Vielleicht habe ich verstanden einfach nicht, wie --relative funktioniert, aber ich fand, dass die

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

einfach ist, die Arbeit zu verstehen und tut.

+0

'--relative' hat nicht für dich funktioniert, weil es damit nichts zu tun hat :) – juzzlin

+0

@juzzlin Vielleicht habe ich einfach nicht verstanden, wie --relativ funktioniert. ;) – andrej

1

Ich war auf der Suche nach einer besseren Lösung, aber ich scheine besser geeignet zu sein, wenn Sie zu viele Unterverzeichnisse haben sie manuell zu erstellen.

Verwenden Sie einfach cp als Zwischenschritt mit der --parents Option

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

cp --parents wird die Struktur für Sie erstellen.

Verwandte Themen