Riutilizzare rsync - output run-run per accelerare il trasferimento effettivo in seguito


23

Di solito lo faccio rsync -nprima di fare un vero rsync. Il fatto è, come potrei automatizzare la seconda corsa per riutilizzare esattamente l'elenco generato con --dry-run?

Voglio dire, se corro, rsync -nottengo una simulazione di cosa rsyncfarebbe, la mia idea sarebbe quella di prendere quell'output, elaborarlo e in qualche modo creare rsyncsolo --include-fromquell'output, quindi l'elenco completo deve essere calcolato solo una volta.

Se questo non ha nemmeno senso, per favore, fammi sapere.

A proposito, tendo a usare rsync -hva --progress --stats --delete --exclude-from "$EXCLUDEFILE". Se hai anche un suggerimento su quali opzioni useresti, per favore, fammi sapere. Sto cercando di duplicare il contenuto di un disco rigido esterno (che contiene solo immagini, video e documenti) su un altro disco rigido esterno.


Potresti provare a reindirizzare l'output del --dry-runcomando in un file (ad esempio, rsync --dry-run -avz SOURCE DEST > include.txt), rimuovendo tutte le righe che non sono file / percorsi da include.txt ed eseguendolo rsync --include-from include.txt.
ThatGuy

L'ultimo comando dovrebbe essere rsync --include-from include.txt --exclude=* SOURCE DEST. Per ulteriori dettagli, consultare stackoverflow.com/a/19296415/1765910 .
ThatGuy

Sì, questa è l'idea, ma non so come farlo (in più vorrei l'approvazione di qualcuno che sa davvero cosa sta facendo). Uso solo rsyncma non so nulla dagli script di shell / bash ...
Manuel,

Risposte:


19

È certamente possibile utilizzare l'elenco di file generato durante una corsa a secco come file di inclusione. Idealmente, tuttavia, le righe extra nella parte superiore e inferiore dell'output di funzionamento a secco dovrebbero essere eliminate.

Esempio di output:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

Per rimuovere queste linee, convogliare l' rsyncoutput in heade in tail. Quindi, salvare l'output elaborato in un file include:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

Infine, indica rsyncdi utilizzare il file include generato (aggiungendo opzioni aggiuntive come desiderato):

rsync --include-from=include.txt --exclude=* source/ dest/


Il problema è che non è in grado di gestire i file che devono essere eliminati. E quel metodo di tail/ è headabbastanza robusto da garantire di avere solo l'elenco dei file?
Manuel,

L'aggiunta --deleteprovoca l' eliminazione dei file eliminati dalle directory di origine anche dalle directory di destinazione, almeno sul computer su cui l'ho provato. È possibile tralasciare completamente la tail/ headparte. rsyncinterpreta ogni riga nel file include come un nome file e ignora semplicemente i file inesistenti, quindi non accadrà nulla se si mantengono le righe extra (a meno che non si abbia file denominati "invio elenco file incrementale", ecc., nel qual caso anche questi file verranno copiati).
Compralo l'
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.