Réponses:
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-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' --relative
option 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 --relative
commencer:
rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/
créerait / préexistant / dir / y / z /.
&&
?
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
rsync
, par conséquent, aucune réponse.
ssh
n'est pas prise en charge et se rsync
connecte à l' rsync daemon
extrémité distante.
L' -R, --relative
option le fera.
Par exemple: si vous souhaitez sauvegarder /var/named/chroot
et créer la même structure de répertoires sur le serveur distant -R
, vous le ferez exactement.
/./
du chemin source. Voir la page de manuel pour plus de détails.
rsync
ne créera pas de répertoires automatiquement si les dossiers cibles n'existent pas. Soupir.
--relative
. Cela pourrait ne pas faire ce que vous pensez.
--relative
en 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.
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 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
rsync /dev/null node:existing-dir/new-dir/
suggestion ci-dessus.
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 myappdata
ré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' -rvv
indicateur 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 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 cela.
rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdata
mais ce qu'elle a créé sur la cible est / remote / path / to / data / myappdata / myappdata /
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
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.