Soluzione 1:
Ora esiste un modo ufficiale per farlo in rsync (versione 3.1.0 protocollo versione 31, testato con Ubuntu Trusty 14.04).
#> ./rsync -a --info=progress2 /usr .
305,002,533 80% 65.69MB/s 0:00:01 xfr#1653, ir-chk=1593/3594)
Ho provato con il mio /usr
folder perché volevo questa funzionalità per il trasferimento di interi filesystem e /usr
sembrava essere un buon campione rappresentativo.
Il --info=progress2
fornisce una buona percentuale complessiva, anche se è solo un valore parziale. Infatti, il mio /usr
cartella è più di 6 concerti:
#> du -sh /usr
6,6G /usr/
e rsync
ci è voluto molto tempo per scansionare tutto. Quindi quasi sempre la percentuale che ho visto è stata completata per circa il 90%, ma è comunque confortante vedere che qualcosa viene copiato :)
Riferimenti:
- https://stackoverflow.com/a/7272339/1396334
- https://download.samba.org/pub/rsync/NEWS#3.1.0
Soluzione 2:
Quanto segue si applica a rsync versione 3.0.0 e successive. Le opzioni descritte di seguito sono state introdotte in quella versione il 1° marzo 2008.
Insieme a --info=progress2 puoi anche usare --no-inc-recursive opzione (o la sua più breve --no-i-r alias) per disabilitare la ricorsione incrementale.
Questo creerà l'intero elenco di file all'inizio, invece di scoprire in modo incrementale più file man mano che il trasferimento procede. Poiché conoscerà tutti i file prima di iniziare, fornirà un rapporto migliore sull'avanzamento complessivo. Questo si applica al numero di file:non riporta alcun progresso in base alle dimensioni dei file.
Ciò comporta un compromesso. Costruire l'intero elenco di file in anticipo è più dispendioso in termini di memoria e può ritardare notevolmente l'inizio del trasferimento effettivo. Come ti aspetteresti, più file ci sono, più lungo sarà il ritardo e più memoria richiederà.
Quanto segue è tratto dal manuale di rsync (fonte - http://rsync.samba.org/ftp/rsync/rsync.html ):
-r, --recursive
Questo dice a rsync di copiare le directory in modo ricorsivo. Vedi anche --dirs (-d). A partire da rsync 3.0.0, l'algoritmo ricorsivo utilizzato è ora una scansione incrementale che utilizza molta meno memoria rispetto a prima e inizia il trasferimento dopo che è stata completata la scansione delle prime directory. Questa scansione incrementale influisce solo sul nostro algoritmo di ricorsione e non modifica un trasferimento non ricorsivo. È anche possibile solo quando entrambe le estremità del trasferimento sono almeno alla versione 3.0.0.
Alcune opzioni richiedono che rsync conosca l'elenco completo dei file, quindi queste opzioni disabilitano la modalità di ricorsione incrementale. Questi includono:--delete-before, --delete-after, --prune-empty-dirs e --delay-updates. Per questo motivo, la modalità di eliminazione predefinita quando specifichi --delete ora è --delete-during quando entrambe le estremità della connessione sono almeno 3.0.0 (usa --del o --delete-during per richiedere questa modalità di eliminazione migliorata esplicitamente). Vedi anche l'opzione --delete-delay che è una scelta migliore rispetto all'utilizzo di --delete-after.
La ricorsione incrementale può essere disabilitata usando --no-inc-recursive opzione o la sua più breve --no-i-r alias.
Vedi anche https://rsync.samba.org per specifiche differenze di versione (scorri verso il basso e dai un'occhiata ai link Release News).
Soluzione 3:
Puoi farlo con 'pv' (apt-get install pv
con Debian e Ubuntu). Consiglio di monitorare il numero di file trasferiti, poiché la quantità di dati trasferiti non è correlata alla dimensione dei file ma al delta tra origine e destinazione. E il conteggio dei file conterà lo stesso progresso per un grande delta e un altro con un piccolo delta. Il che significa che in ogni caso la stima dell'ETA potrebbe essere lontana. L'ETA basato sulla dimensione funziona solo se la tua destinazione è vuota, in questo caso delta ==dimensione della sorgente.
L'idea generale è di emettere una riga per file 'trasferito' da rsync e contare quelle righe con 'pv':
rsync -ai /source remote:/dest | pv -les [number of files] >/dev/null
Tendo a fare il backup di interi filesystem (per diversi motivi), in questo caso puoi usare il molto più economico df
per ottenere il numero di file (anziché du
o find
che attraverserà la tua gerarchia di origine un'altra volta dopo che rsync lo ha fatto). L'opzione -x sembra assicurarsi che rsync rimanga sullo stesso filesystem di origine (e non segua altri montaggi interni):
rsync -aix /source remote:/dest | pv -les $(df -i /source | perl -ane 'print $F[2] if $F[5] =~ m:^/:') >/dev/null
Se vuoi contare i file in /source in modo generale, usa find /source|wc -l
(di nuovo attenzione:potrebbe essere lento e pesante su I/O).
Soluzione 4:
Danakim ha ragione. Non ci sono modi banali per aggiungere un indicatore di progresso totale.
La ragione di ciò è che quando rsync esamina un elenco di file da sincronizzare, non sa in anticipo quali file dovranno essere modificati. Se stai effettuando trasferimenti delta, i delta stessi devono essere calcolati in anticipo per fornire un quadro completo del lavoro che deve essere svolto.
In altre parole, il modo più semplice per calcolare quanto lavoro c'è da fare è farlo effettivamente.
Soluzione 5:
Per i trasferimenti lunghi, sono contento di eseguire du -s
su entrambi i lati. Anche watch -n1 du -s
, se mi sento davvero ansioso.
watch
esegue un comando (du -s
qui) periodicamente (ogni secondo qui) e mostra l'output a schermo intero.