web-dev-qa-db-fra.com

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

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

Comment puis je faire ça?

124
ufk

Si vous avez plus que le dernier répertoire feuille à créer, vous pouvez exécuter un fichier ssh ... mkdir -p _ d'abord, ou utilisez le --rsync-path astuce comme expliqué ici :

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

Ou utilisez le --relative option proposé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 avoir "y/z /" créé, mais pas dans "nouveau/x /", vous pouvez ajouter ./ où tu veux --relativepour commencer:

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

créerait/pre_existing/dir/y/z /.

130
mivk

En supposant que vous utilisiez ssh pour vous connecter à rsync, pourquoi ne pas envoyer une commande ssh avant:

ssh user@server mkdir -p existingdir/newdir

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

32
Alfredo Yong

Le -R, --relative option le fera.

Par exemple: si vous voulez sauvegarder /var/named/chroot et créez la même structure de répertoires sur le serveur distant, puis -R fera exactement cela.

14
Tony

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.

13
kdubs

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

rsync --recursive emptydir/ destination/newdir

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

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

à votre santé

Chris

4
Chris Dennis

Cette réponse utilise un peu d'autres réponses, mais j'espère que les choses seront un peu plus claires. Vous n'avez jamais spécifié ce que vous récuriez: une seule entrée de répertoire ou plusieurs fichiers.

Supposons donc que vous déplacez une entrée du répertoire source, et pas seulement les fichiers qu’elle contient.

Disons que vous avez un répertoire appelé localement data/myappdata/ et vous avez une charge de sous-répertoires sous celle-ci. Tu as data/ sur votre machine cible mais pas data/myappdata/ - c'est assez facile:

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 déplacez que des fichiers et que vous ne déplacez pas l'entrée de répertoire qui les contient, procédez comme suit:

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

et il créera le répertoire myappdata sur lequel vous pourrez placer vos fichiers sur la machine distante. Encore une fois, le fichier data/ répertoire doit exister sur la machine distante.

Incidemment, mon utilisation de -rvv_ flag a pour but d’obtenir une sortie doublement verbeuse afin d’indiquer clairement ce qu’elle fait, ainsi que le comportement récursif nécessaire.

Juste pour vous montrer ce que je reçois 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 cette question.

3
Mandible79

par exemple:

à partir de: /xxx/a/b/c/d/e/1.html

à: utilisateur @ distant: /pre_existing/dir/b/c/d/e/1.html

rsync:

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

2
Montage