rsync: come posso configurarlo per creare la directory di destinazione sul server?


144

Vorrei rsyncdal computer locale al server. Su una directory che non esiste e voglio prima rsynccreare quella directory sul server.

Come lo posso fare?

Risposte:


162

Se hai più dell'ultima directory foglia da creare, puoi ssh ... mkdir -pprima eseguirne una separata o usare il --rsync-pathtrucco come spiegato qui :

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

Oppure usa l' --relativeopzione 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 --relativeiniziare:

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

creerebbe / pre-esistente / dir / y / z /.


2
Il server a cui accedo non ha 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.
Fabiano Soriani,

1
Questo non sembra funzionare su protocolli rsync più recenti, ricevo un errore simile al seguente quando uso && o; in --rsync-path caratteri non validi nel comando scp! qui: && / usr / bin / rsync
ghitesh,

@ghitesh hai provato a sfuggire al &&?
Felipe Alvarez,

@FelipeAlvarez Sì, l'ho fatto, ma non ha funzionato. Non sono in grado di trovare il collegamento ora, ma alcuni documenti hanno affermato che questo problema è stato risolto, poiché credo che potrebbe (e sia stato) sfruttato.
ghitesh,

Grazie, funziona. Nel mio caso stavo eseguendo uno script bash locale su un server remoto e all'interno di quello in esecuzione il comando ssh mkdir che stava eseguendo, ma poi ho ucciso il resto dello script prima di eseguire il comando rsync. Ciò consente al resto dello script di essere eseguito senza problemi.
johndavid400,

33

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


4
La richiesta di ufk è di sintassi che provocherà "rsync per creare [una destinazione mancante] directory sul server [&& copia i file]." La tua risposta è valida in quanto creerà la directory di destinazione mancante sul server ... ma non con rsync, quindi, nessuna risposta.
TomRoche,

Questa non è un'opzione se sshnon è supportata e si rsynccollega rsync daemonall'estremità remota.
Krzysztof Jabłoński,

19

L' -R, --relativeopzione farà questo.

Ad esempio: se si desidera eseguire il backup /var/named/chroote creare la stessa struttura di directory sul server remoto, -Rlo farà.


12
È inoltre possibile specificare solo una parte del percorso da creare utilizzando /./nel percorso di origine. Vedi la pagina man per i dettagli.
Marki555,

21
Perché votare? La risposta è errata, rsyncnon creerà automaticamente le directory se non esistono cartelle di destinazione. Sospiro.
zeekvfu,

3
Consiglio vivamente ai lettori di controllare la manpage per --relative. Potrebbe non fare quello che pensi.
FiloSottile,

3
--relative mantiene il percorso completo, anziché il file, sull'endpoint fornito sul server. Normalmente /tmp/foo/bar/file.c su remote: / tmp produrrebbe remote: /tmp/file.c ma con -R crea /tmp/foo/bar/file.c Non usare questa opzione a meno che sai cosa stai facendo, otterrai una struttura di directory davvero disordinata.
Cormac Mulhall,

7
Il commento di @ Marki555 è la chiave del successo. --relativeinsieme 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.
Daniel F

15

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.


Grazie per la risposta kdubs. Ha funzionato alla grande. Quindi, se voglio mantenere i file che sto sincronizzando all'interno della cartella che sto indicando come sorgente, allora devo solo specificarlo e viene creato. es: rsync -avph / mytest / / otherfolder / mytest / Quindi ottengo l'output "directory creata / otherfolder / mytest"
mbrinson,

1
Non dimenticare la barra ('/') alla fine di new-dir, altrimenti creerà un file non di directory.
tartaruga_casco_mole

4

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


Non è necessario utilizzare la cartella temporanea. Vedi rsync /dev/null node:existing-dir/new-dir/suggerimento sopra.
lucid_dreamer,

3

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 myappdatadirectory 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.


Questo non funziona esattamente come previsto. Ho provato il primo comando rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdatama quello che ha creato sulla destinazione è / remote / path / to / data / myappdata / myappdata /
harleygolfguy

Se apporto una leggera modifica al tuo primo comando e aggiungo una barra "/" dopo il percorso sorgente, allora funziona ... così: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy,

2

per esempio:

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.