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

StackOverflow https://stackoverflow.com/questions/1636889

  •  06-07-2019
  •  | 
  •  

Question

J'aimerais rsync d'un ordinateur local au serveur. Sur un répertoire qui n'existe pas et sur lequel je souhaite que rsync crée d'abord ce répertoire sur le serveur.

Comment puis-je faire cela?

Était-ce utile?

La solution

Si vous avez plus que le dernier répertoire feuille à créer, vous pouvez d'abord exécuter un ssh ... mkdir -p distinct, ou utiliser 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 l'option - relative proposée par Tony. Dans ce cas, vous spécifiez uniquement 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 souhaitez avoir " y / z / " créé, mais pas à l'intérieur de "new / x /", vous pouvez ajouter ./ à l'emplacement où vous souhaitez que - relatif commence:

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

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

Autres conseils

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

L’option -R, --relative le fera.

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

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.

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 créer en tant que répertoire temporaire).

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

acclamations

Chris

Cette réponse utilise un peu d'autres réponses, mais j'espère que cela sera un peu plus clair quant aux circonstances. 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 qui y sont contenus.

Supposons que vous avez un répertoire localement appelé data / myappdata / et que vous avez une charge de sous-répertoires sous celui-ci. Vous avez data / sur votre machine cible, mais pas de 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 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 placerez vos fichiers sur la machine distante. Là encore, le répertoire data / doit exister sur la machine distante.

Incidemment, mon utilisation de l'indicateur -rvv consiste à obtenir une sortie doublement détaillée, ce qui explique clairement son rôle et 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 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

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

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 / & amp; & amp; rsync -auvR b / c / d / e / utilisateur @ distant: / pre_existing / dir /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top