Risposte:
Se hai più dell'ultima directory foglia da creare, puoi ssh ... mkdir -p
prima eseguirne una separata o usare il --rsync-path
trucco come spiegato qui :
rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/
Oppure usa l' --relative
opzione come suggerito da Tony. In tal caso, si specifica solo la radice della destinazione, che deve esistere, e non la struttura di directory della fonte, che verrà creata:
rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/
In questo modo, finirai con / pre_existing / dir / new / x / y / z /
E se si desidera creare "y / z /", ma non all'interno di "new / x /", è possibile aggiungere da ./
dove si desidera --relative
iniziare:
rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/
creerebbe / pre-esistente / dir / y / z /.
&&
?
Supponendo che tu stia usando ssh per connettere rsync, che cosa sta per inviare un comando ssh prima di:
ssh user@server mkdir -p existingdir/newdir
se esiste già, non succede nulla
rsync
, quindi, nessuna risposta.
ssh
non è supportata e si rsync
collega rsync daemon
all'estremità remota.
L' -R, --relative
opzione farà questo.
Ad esempio: se si desidera eseguire il backup /var/named/chroot
e creare la stessa struttura di directory sul server remoto, -R
lo farà.
/./
nel percorso di origine. Vedi la pagina man per i dettagli.
rsync
non creerà automaticamente le directory se non esistono cartelle di destinazione. Sospiro.
--relative
. Potrebbe non fare quello che pensi.
--relative
insieme a /./
ciò che la maggior parte dei neofiti cercherà. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/
copierà il contenuto del desktop sul desktop di destinazione. Non so come le differenze nei nomi utente potrebbero influire su questo.
questo ha funzionato per me:
rsync /dev/null node:existing-dir/new-dir/
Ricevo questo messaggio:
skipping non-regular file "null"
ma non devo preoccuparmi di avere una directory vuota in giro.
Non penso che tu possa farlo con un solo comando rsync, ma puoi 'pre-creare' la directory extra prima come questa:
rsync --recursive emptydir/ destination/newdir
dove 'emptydir' è una directory vuota locale (che potrebbe essere necessario creare prima come directory temporanea).
È un po 'un trucco, ma funziona per me.
Saluti
Chris
rsync /dev/null node:existing-dir/new-dir/
suggerimento sopra.
Questa risposta utilizza frammenti di altre risposte, ma speriamo che sia un po 'più chiaro in merito alle circostanze. Non hai mai specificato cosa stavi eseguendo rsyncing: una singola voce della directory o più file.
Supponiamo quindi che si stia spostando una voce della directory di origine e non spostando solo i file in essa contenuti.
Supponiamo che tu abbia una directory chiamata localmente data/myappdata/
e sotto di essa ci sono molte sottodirectory. Hai data/
sulla tua macchina target ma no data/myappdata/
- questo è abbastanza facile:
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
Puoi anche usare un nome diverso per la directory remota:
rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname
Se stai semplicemente spostando alcuni file e non stai spostando la voce della directory che li contiene, allora dovresti:
rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/
e creerà la myappdata
directory per te sul computer remoto in cui inserire i tuoi file. Ancora una volta, il filedata/
directory deve esistere sul computer remoto.
Per inciso, il mio uso di -rvv
flag è quello di ottenere un output doppiamente dettagliato, quindi è chiaro su ciò che fa, nonché sul necessario comportamento ricorsivo.
Solo per mostrarti cosa ottengo usando rsync (3.0.9 su 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
Spero che questo chiarisca un po 'questo.
rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdata
ma quello che ha creato sulla destinazione è / remote / path / to / data / myappdata / myappdata /
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
mkdir
, quindi sto usando l'hack:--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \
crea un file extra ma puoi rimuoverlo in seguito.