rsync: Wie kann ich es so konfigurieren, dass ein Zielverzeichnis auf dem Server erstellt wird?


142

Ich möchte rsyncvom lokalen Computer zum Server. In einem Verzeichnis, das nicht existiert, und ich möchte rsyncdieses Verzeichnis zuerst auf dem Server erstellen.

Wie kann ich das machen?

Antworten:


161

Wenn Sie mehr als das zuletzt zu erstellende Blattverzeichnis haben, können Sie entweder zuerst ein separates Verzeichnis ausführen ssh ... mkdir -poder den hier beschriebenen --rsync-pathTrick anwenden :

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/

Oder verwenden Sie die --relativevon Tony vorgeschlagene Option. In diesem Fall geben Sie nur das Stammverzeichnis des Ziels an, das vorhanden sein muss, und nicht die Verzeichnisstruktur der Quelle, die erstellt wird:

rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/

Auf diese Weise erhalten Sie / pre_existing / dir / new / x / y / z /

Und wenn Sie "y / z /" erstellen möchten, aber nicht in "new / x /", können Sie hinzufügen, ./wo Sie --relativebeginnen möchten :

rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/

würde / pre_existing / dir / y / z / erstellen.


2
Der Server, auf den ich zugreife, hat keinen mkdir, also verwende ich den Hack: --rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \Er erstellt eine zusätzliche Datei, die Sie jedoch später entfernen können.
Fabiano Soriani

1
Dies scheint bei neueren rsync-Protokollen nicht zu funktionieren. Bei Verwendung von && oder; wird ein Fehler angezeigt, der dem folgenden ähnelt. in --rsync-path ungültige Zeichen im Befehl scp! hier: && / usr / bin / rsync
ghitesh

@ghitesh hast du versucht, dem zu entkommen &&?
Felipe Alvarez

@FelipeAlvarez Ja, ich habe es getan, aber es hat nicht funktioniert. Ich kann den Link jetzt nicht finden, aber einige Dokumentationen besagen, dass dies behoben ist, da ich glaube, dass er ausgenutzt werden könnte (und wurde).
Ghitesh

Danke, das funktioniert. In meinem Fall habe ich ein lokales Bash-Skript auf einem Remote-Server ausgeführt und darin den Befehl ssh mkdir ausgeführt, der ausgeführt wurde, aber dann den Rest des Skripts beendet, bevor der Befehl rsync ausgeführt wurde. Dadurch kann der Rest des Skripts ohne Probleme ausgeführt werden.
Johndavid400

33

Angenommen, Sie verwenden ssh, um rsync zu verbinden, und senden Sie vorher einen ssh-Befehl:

ssh user@server mkdir -p existingdir/newdir

Wenn es bereits existiert, passiert nichts


4
ufk fordert eine Syntax an, die dazu führt, dass "rsync [ein fehlendes Ziel] -Verzeichnis auf dem Server erstellt [&& die Dateien kopiert]". Ihre Antwort ist rsyncinsofern gültig, als sie das fehlende Zielverzeichnis auf dem Server erstellt ... aber nicht mit daher keiner Antwort.
TomRoche

Dies ist keine Option, wenn dies sshnicht unterstützt wird und eine rsyncVerbindung zum rsync daemonRemote-Ende hergestellt wird.
Krzysztof Jabłoński

19

Die -R, --relativeOption wird dies tun.

Beispiel: Wenn Sie /var/named/chrootdieselbe Verzeichnisstruktur auf dem Remote-Server sichern und erstellen möchten, -Rtun Sie genau das.


12
Sie können auch nur einen Teil des Pfads angeben, der mithilfe /./des Quellpfads erstellt werden soll. Siehe Manpage für Details.
Marki555

20
Warum upvote? Die Antwort ist falsch. rsyncVerzeichnisse werden nicht automatisch erstellt, wenn keine Zielordner vorhanden sind. Seufzer.
Zeekvfu

3
Ich empfehle den Lesern dringend, auf der Manpage nachzuschauen --relative. Es könnte nicht tun, was Sie denken.
FiloSottile

3
--relative speichert den vollständigen Pfad und nicht die Datei am Endpunkt, den Sie auf dem Server angeben. Normalerweise würde /tmp/foo/bar/file.c zu remote: / tmp remote: /tmp/file.c erzeugen, aber mit -R wird /tmp/foo/bar/file.c erstellt. Verwenden Sie diese Option nur, wenn Sie dies tun Wenn Sie wissen, was Sie tun, erhalten Sie eine wirklich unordentliche Verzeichnisstruktur.
Cormac Mulhall

7
Der Kommentar von @ Marki555 ist der Schlüssel zum Erfolg. --relativein Verbindung mit /./ist das, wonach die meisten Neulinge suchen werden. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/kopiert den Inhalt des Desktops auf den Zieldesktop. Ich weiß nicht, wie sich Unterschiede in den Benutzernamen darauf auswirken können.
Daniel F

15

das hat bei mir funktioniert:

 rsync /dev/null node:existing-dir/new-dir/

Ich bekomme diese Nachricht:

skipping non-regular file "null"

Aber ich muss mir keine Sorgen machen, dass ein leeres Verzeichnis herumhängt.


Danke für die Antwort kdubs. Das hat super geklappt. Wenn ich also die Dateien, die ich synchronisiere, in dem Ordner behalten möchte, auf den ich als Quelle verweise, muss ich sie nur angeben, und sie wird erstellt. Beispiel: rsync -avph / mytest / / otherfolder / mytest / Dann erhalte ich die Ausgabe "erstelltes Verzeichnis / otherfolder / mytest"
mbrinson

1
Vergessen Sie nicht den Schrägstrich ('/') am Ende von new-dir, da sonst eine Nicht-Verzeichnisdatei erstellt wird.
tartaruga_casco_mole

4

Ich glaube nicht, dass Sie dies mit einem rsync-Befehl tun können, aber Sie können das zusätzliche Verzeichnis zuerst wie folgt vorab erstellen:

rsync --recursive emptydir/ destination/newdir

Dabei ist 'Emptydir' ein lokales leeres Verzeichnis (das Sie möglicherweise zuerst als temporäres Verzeichnis erstellen müssen).

Es ist ein bisschen wie ein Hack, aber es funktioniert für mich.

Prost

Chris


Kein temporärer Ordner erforderlich. Siehe rsync /dev/null node:existing-dir/new-dir/Vorschlag oben.
lucid_dreamer

3

Diese Antwort verwendet Teile anderer Antworten, aber hoffentlich sind die Umstände etwas klarer. Sie haben nie angegeben, was Sie synchronisieren - einen einzelnen Verzeichniseintrag oder mehrere Dateien.

Nehmen wir also an, Sie verschieben einen Quellverzeichniseintrag und nicht nur die darin enthaltenen Dateien.

Angenommen, Sie haben ein lokal aufgerufenes Verzeichnis data/myappdata/und darunter eine Menge Unterverzeichnisse. Sie haben data/auf Ihrem Zielcomputer aber nein data/myappdata/- das ist einfach genug:

rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata

Sie können sogar einen anderen Namen für das Remote-Verzeichnis verwenden:

rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname

Wenn Sie nur einige Dateien verschieben und den Verzeichniseintrag, der sie enthält, nicht verschieben, gehen Sie wie folgt vor:

rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/

und es wird das myappdataVerzeichnis für Sie auf dem Remotecomputer erstellt, in dem Sie Ihre Dateien ablegen können. Auch hier muss das data/Verzeichnis auf dem Remotecomputer vorhanden sein.

Im Übrigen verwende ich -rvvflag, um eine doppelt ausführliche Ausgabe zu erhalten, damit klar ist, was es tut und welches rekursive Verhalten erforderlich ist.

Nur um Ihnen zu zeigen, was ich bei Verwendung von rsync bekomme (3.0.9 unter Ubuntu 12.04)

$ rsync -rvv *.txt user@remote.machine:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
user@remote.machine's password:
sending incremental file list
created directory /tmp/newdir
delta-transmission enabled
bar.txt
foo.txt
total: matches=0  hash_hits=0  false_alarms=0 data=0

Hoffe das klärt das ein wenig auf.


Dies funktioniert nicht genau wie erwartet. Ich habe den ersten Befehl ausprobiert, rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdataaber was er auf dem Ziel erstellt hat, ist / remote / path / to / data / myappdata / myappdata /
harleygolfguy

Wenn ich eine kleine Änderung an Ihrem ersten Befehl vornehme und nach dem rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
Quellpfad

2

z.B:

von: /xxx/a/b/c/d/e/1.html

an: user @ remote: /pre_existing/dir/b/c/d/e/1.html

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / user @ remote: / pre_existing / dir /

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.