2013-08-28 4 views
26

Sto cercando un programma simile a rsync che creerà eventuali directory madri mancanti sul lato remoto.rsync - crea tutte le directory madri mancanti?

Per esempio, se ho /top/a/b/c/d su un server e solo /top/a esiste sul server remoto, voglio copiare d al server remoto e hanno le b e c directory create pure.

Il comando:

rsync /top/a/b/c/d remote:/top/a/b/c 

non funzionerà perché /tmp/a/b non esiste sul server remoto. E se esistesse, il file d verrebbe copiato nel percorso /top/a/b/c.

Ciò è possibile a che fare con rsync utilizzando --include e --exclude interruttori, ma è molto coinvolto, per es .:

rsync -v -r a dest:dir \ 
    --include 'a/b'  \ 
    --include 'a/b/c'  \ 
    --include 'a/b/c/d' \ 
    --include 'a/b/c/d/e' \ 
    --exclude 'a/*'  \ 
    --exclude 'a/b/*'  \ 
    --exclude 'a/b/c/*' \ 
    --exclude 'a/b/c/d/*' 

interessa solo il a/b/c/d/e-dest:dir/a/b/c/d/e anche se le directory intermedie hanno file. (Nota: gli include devono precedere gli esclusi.)

Esistono altre opzioni?

+0

Vedi anche [rsync: come posso configurarlo per creare directory di destinazione sul server?] (Http://stackoverflow.com/questions/1636889/rsync-how-can-i-configure-it-to-create- target-directory-on-server) – mivk

+0

Eventuali duplicati di [Come forzare rsync per creare la cartella di destinazione] (https://stackoverflow.com/questions/9242135/how-to-force-rsync-to-create-destination-folder) – user

risposta

4

vi suggerisco di far rispettare l'esistenza manualmente:

ssh [email protected] mkdir -p /top/a/b/c 
rsync /top/a/b/c/d remote:/top/a/b/c 

questo crea la cartella di destinazione, se non esiste già.

+2

Sì - questo è un modo per farlo. Ma sembra che il mio caso d'uso sia uno scenario così utile che dovrebbe esserci un comando per esso o alcune opzioni per rsync. – ErikR

+1

non sono a conoscenza di tali flag. – mnagel

13

Si può essere alla ricerca di

rsync -aR 

ad esempio:

rsync -a --relative /top/a/b/c/d remote:/ 

Vedi anche questo trucco in other question.

+2

Perché includere anche '-a'? Sono abbastanza sicuro che non è necessario. –

+1

@KennyEvitt '-a' utilizza ricorsive (' -r '), ma non parente ('-r') in modo' -a' è ancora necessaria a volte per preservare proprietario/permanenti ('-aR'). Puoi testarlo eseguendo rsync come root (o un altro utente) per vedere questo comportamento. – dhaupin

+1

'--relative' non si _create_ mancano componenti di directory sul lato remoto, come nella questione. – juzzlin

1

--relative non funziona per me dal momento che avevo una configurazione diversa. Forse ho semplicemente non ha capito come --relative opere, ma ho trovato che il

ssh remote mkdir -p /top/a/b/c 
rsync /top/a/b/c/d remote:/top/a/b/c 

è facile da capire e fa il lavoro.

+0

'--relative' non ha funzionato per te, perché non ha nulla a che fare con questo :) – juzzlin

+0

@juzzlin Forse non ho capito come funziona. ;) – andrej

1

Stavo cercando una soluzione migliore, ma la mia sembra essere più adatta quando hai troppe sottodirectory per crearle manualmente.

Semplicemente utilizzare cp come passo intermedio con l'opzione di --parents

cp --parents /your/path/sub/dir/ /tmp/localcopy 
rsync [options] /tmp/localcopy/* remote:/destination/path/ 

cp --parents creerà la struttura per voi.