rsync: comment puis-je le configurer pour créer un répertoire cible sur le serveur?

144

Je voudrais rsyncd'un ordinateur local au serveur. Sur un répertoire qui n'existe pas, et je veux rsyncd'abord créer ce répertoire sur le serveur.

Comment puis je faire ça?

ufk
la source

Réponses:

162

Si vous avez plus que le dernier répertoire feuille à créer, vous pouvez soit en exécuter un autre ssh ... mkdir -p, soit utiliser l' --rsync-pathastuce comme expliqué ici :

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

Ou utilisez l' --relativeoption suggérée par Tony. Dans ce cas, vous ne spécifiez que la racine de la destination, qui doit exister, et non la structure de répertoires de la source, qui sera créée:

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

De cette façon, vous vous retrouverez avec / pre_existing / dir / new / x / y / z /

Et si vous voulez créer "y / z /", mais pas dans "new / x /", vous pouvez ajouter ./où vous voulez --relativecommencer:

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

créerait / préexistant / dir / y / z /.

mivk
la source
2
Le serveur auquel j'accède n'a pas mkdir, donc j'utilise le hack: --rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \il crée un fichier supplémentaire mais vous pouvez le supprimer plus tard.
Fabiano Soriani
1
Cela ne semble pas fonctionner sur les protocoles rsync plus récents, j'obtiens une erreur similaire à la suivante lors de l'utilisation de && ou; dans --rsync-path caractères invalides dans la commande scp! ici: && / usr / bin / rsync
ghitesh
@ghitesh avez-vous essayé d'échapper au &&?
Felipe Alvarez du
@FelipeAlvarez Oui, je l'ai fait, mais je n'ai pas fonctionné. Je ne suis pas en mesure de trouver le lien pour le moment, mais une documentation indique que cela est corrigé, car je pense qu'il pourrait (et a été) exploité.
ghitesh le
Merci, cela fonctionne. Dans mon cas, j'exécutais un script bash local sur un serveur distant et dans celui-ci exécutait la commande ssh mkdir qui était en cours d'exécution, mais tuais ensuite le reste du script avant d'exécuter la commande rsync. Cela permet au reste du script de s'exécuter sans problème.
johndavid400
33

En supposant que vous utilisez ssh pour connecter rsync, qu'en est-il d'envoyer une commande ssh avant:

ssh user@server mkdir -p existingdir/newdir

s'il existe déjà, rien ne se passe

Alfredo Yong
la source
4
La requête de ufk concerne la syntaxe qui obligera "rsync à créer un répertoire [cible manquant] sur le serveur [&& copier les fichiers]". Votre réponse est valide dans la mesure où elle créera le répertoire cible manquant sur le serveur ... mais pas avec rsync, par conséquent, aucune réponse.
TomRoche
Ce n'est pas une option si elle sshn'est pas prise en charge et se rsyncconnecte à l' rsync daemonextrémité distante.
Krzysztof Jabłoński
19

L' -R, --relativeoption le fera.

Par exemple: si vous souhaitez sauvegarder /var/named/chrootet créer la même structure de répertoires sur le serveur distant -R, vous le ferez exactement.

Tony
la source
12
Vous pouvez également spécifier uniquement une partie du chemin à créer à l'aide /./du chemin source. Voir la page de manuel pour plus de détails.
Marki555 du
21
Pourquoi voter? La réponse est fausse, rsyncne créera pas de répertoires automatiquement si les dossiers cibles n'existent pas. Soupir.
zeekvfu
3
Je suggère fortement aux lecteurs de consulter la page de manuel --relative. Cela pourrait ne pas faire ce que vous pensez.
FiloSottile
3
--relative colle le chemin complet, plutôt que le fichier, au point final que vous fournissez sur le serveur. Normalement /tmp/foo/bar/file.c vers remote: / tmp produirait remote: /tmp/file.c mais avec -R il crée /tmp/foo/bar/file.c N'utilisez pas cette option sauf si vous sachez ce que vous faites, vous obtiendrez une structure de répertoires vraiment désordonnée.
Cormac Mulhall
7
Le commentaire de @ Marki555 est la clé du succès. --relativeen conjonction avec /./c'est ce que la plupart des débutants recherchent. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/copiera le contenu du bureau sur le bureau cible. Je ne sais pas comment les différences de noms d'utilisateur peuvent affecter cela.
Daniel F
15

cela a fonctionné pour moi:

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

Je reçois ce message:

skipping non-regular file "null"

mais je n'ai pas à m'inquiéter d'avoir un répertoire vide qui traîne.

kdubs
la source
Merci pour la réponse kdubs. Cela a très bien fonctionné. Donc, si je veux conserver les fichiers que je synchronise dans le dossier que je désigne comme source, il me suffit de le spécifier et il sera créé. ex: rsync -avph / mytest / / otherfolder / mytest / Ensuite, j'obtiens la sortie "created directory / otherfolder / mytest"
mbrinson
1
N'oubliez pas la barre oblique ('/') à la fin de new-dir, sinon cela créera un fichier hors répertoire.
tartaruga_casco_mole
4

Je ne pense pas que vous puissiez le faire avec une seule commande rsync, mais vous pouvez d'abord `` pré-créer '' le répertoire supplémentaire comme ceci:

rsync --recursive emptydir/ destination/newdir

où 'emptydir' est un répertoire local vide (que vous devrez peut-être d'abord créer comme répertoire temporaire).

C'est un peu un hack, mais ça marche pour moi.

à votre santé

Chris

Chris Dennis
la source
Pas besoin d'utiliser un dossier temporaire. Voir la rsync /dev/null node:existing-dir/new-dir/suggestion ci-dessus.
lucid_dreamer
3

Cette réponse utilise des fragments d'autres réponses, mais j'espère que ce sera un peu plus clair quant aux circonstances. Vous n'avez jamais spécifié ce que vous étiez en train de rsynchroniser - une seule entrée de répertoire ou plusieurs fichiers.

Supposons donc que vous déplaciez une entrée de répertoire source, et pas seulement les fichiers qu'elle contient.

Disons que vous avez un répertoire appelé localement data/myappdata/et que vous avez une charge de sous-répertoires en dessous. Vous avez data/sur votre machine cible mais non data/myappdata/- c'est assez simple:

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

Vous pouvez même utiliser un nom différent pour le répertoire distant:

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

Si vous ne faites que déplacer certains fichiers et ne déplacez pas l'entrée de répertoire qui les contient, vous feriez:

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

et il créera le myappdatarépertoire pour vous sur la machine distante pour y placer vos fichiers. Encore une fois, le data/répertoire doit exister sur la machine distante.

Incidemment, mon utilisation de l' -rvvindicateur est d'obtenir une sortie doublement verbeuse afin que ce soit clair sur ce qu'il fait, ainsi que sur le comportement récursif nécessaire.

Juste pour vous montrer ce que j'obtiens en utilisant rsync (3.0.9 sur Ubuntu 12.04)

$ rsync -rvv *.txt [email protected]:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
[email protected]'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

J'espère que cela clarifie un peu cela.

Mandibule79
la source
Cela ne fonctionne pas exactement comme prévu. J'ai essayé la première commande rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdatamais ce qu'elle a créé sur la cible est / remote / path / to / data / myappdata / myappdata /
harleygolfguy
Si je modifie légèrement votre première commande et que j'ajoute une barre oblique '/' après le chemin source, alors cela fonctionne ... comme ceci: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy
2

par exemple:

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

à: 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 /

Montage
la source