Solution 1 :
Il existe maintenant un moyen officiel de le faire dans rsync (protocole version 3.1.0 version 31, testé avec 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)
J'ai essayé avec mon /usr
dossier parce que je voulais cette fonctionnalité pour transférer des systèmes de fichiers entiers, et /usr
semblait être un bon échantillon représentatif.
Le --info=progress2
donne un bon pourcentage global, même s'il ne s'agit que d'une valeur partielle. En fait, mon /usr
le dossier contient plus de 6 concerts :
#> du -sh /usr
6,6G /usr/
et rsync
a pris beaucoup de temps pour tout scanner. Donc, presque tout le temps, le pourcentage que j'ai vu était d'environ 90 %, mais il est néanmoins réconfortant de voir que quelque chose est copié :)
Références :
- https://stackoverflow.com/a/7272339/1396334
- https://download.samba.org/pub/rsync/NEWS#3.1.0
Solution 2 :
Ce qui suit s'applique à la version 3.0.0 et supérieure de rsync. Les options décrites ci-dessous ont été introduites dans cette version le 1er mars 2008.
Avec --info=progress2 vous pouvez également utiliser --no-inc-recursive option (ou son raccourci --no-i-r alias) pour désactiver la récursivité incrémentielle.
Cela construira la liste complète des fichiers au début, plutôt que de découvrir progressivement plus de fichiers au fur et à mesure du transfert. Puisqu'il connaîtra tous les fichiers avant de commencer, il donnera un meilleur rapport de la progression globale. Cela s'applique au nombre de fichiers - il ne signale aucune progression en fonction de la taille des fichiers.
Cela implique un compromis. Construire la liste complète des fichiers à l'avance est plus coûteux en mémoire et peut retarder considérablement le début du transfert réel. Comme vous vous en doutez, plus il y a de fichiers, plus le délai sera long et plus il nécessitera de mémoire.
Ce qui suit provient du manuel de rsync (source - http://rsync.samba.org/ftp/rsync/rsync.html) :
-r, --recursive
Cela indique à rsync de copier les répertoires de manière récursive. Voir aussi --dirs (-d). À partir de rsync 3.0.0, l'algorithme récursif utilisé est désormais une analyse incrémentielle qui utilise beaucoup moins de mémoire qu'auparavant et commence le transfert une fois l'analyse des premiers répertoires terminée. Cette analyse incrémentielle n'affecte que notre algorithme de récursivité et ne modifie pas un transfert non récursif. Cela n'est également possible que lorsque les deux extrémités du transfert sont au moins en version 3.0.0.
Certaines options nécessitent que rsync connaisse la liste complète des fichiers, donc ces options désactivent le mode de récursivité incrémentielle. Ceux-ci incluent :--delete-before, --delete-after, --prune-empty-dirs et --delay-updates. Pour cette raison, le mode de suppression par défaut lorsque vous spécifiez --delete est maintenant --delete-during lorsque les deux extrémités de la connexion sont au moins 3.0.0 (utilisez --del ou --delete-during pour demander ce mode de suppression amélioré explicitement). Voir aussi l'option --delete-delay qui est un meilleur choix que d'utiliser --delete-after.
La récursivité incrémentielle peut être désactivée à l'aide de la commande --no-inc-recursive option ou son raccourci --no-i-r alias.
Voir également https://rsync.samba.org pour les différences de version spécifiques (faites défiler vers le bas et consultez les liens Release News).
Solution 3 :
Vous pouvez avec 'pv' (apt-get install pv
avec Debian et Ubuntu). Je recommande de surveiller le nombre de fichiers transférés, car la quantité de données transférées n'est pas corrélée à la taille des fichiers mais au delta entre la source et la destination. Et le comptage des fichiers comptera la même progression pour un grand delta et un autre avec un petit delta. Ce qui signifie que dans tous les cas, l'estimation de l'ETA pourrait être loin. L'ETA basé sur la taille ne fonctionne que si votre destination est vide, dans ce cas delta ==taille de la source.
L'idée générale est d'émettre une ligne par fichier "transféré" depuis rsync, et de compter ces lignes avec "pv" :
rsync -ai /source remote:/dest | pv -les [number of files] >/dev/null
J'ai tendance à sauvegarder des systèmes de fichiers entiers (pour plusieurs raisons), dans ce cas, vous pouvez utiliser le df
beaucoup moins cher pour obtenir le nombre de fichiers (plutôt que du
ou find
qui traversera votre hiérarchie source une autre fois après que rsync l'ait fait). L'option -x apparaît pour s'assurer que rsync reste sur le même système de fichiers source (et ne suit pas les autres montages internes) :
rsync -aix /source remote:/dest | pv -les $(df -i /source | perl -ane 'print $F[2] if $F[5] =~ m:^/:') >/dev/null
Si vous souhaitez compter les fichiers dans /source de manière générale, utilisez find /source|wc -l
(attention à nouveau :peut être lent et lourd en E/S).
Solution 4 :
Danakim a raison. Il n'y a pas de manière triviale d'ajouter un indicateur de progression total.
La raison en est que lorsque rsync examine une liste de fichiers à synchroniser, il ne sait pas à l'avance quels fichiers devront être modifiés. Si vous effectuez des transferts delta, les deltas eux-mêmes doivent être calculés à l'avance pour donner une image globale du travail qui doit être fait.
En d'autres termes, le moyen le plus simple de calculer la quantité de travail à effectuer est de le faire réellement.
Solution 5 :
Pour les longs transferts, je me contente d'exécuter du -s
sur les deux côtés. Même watch -n1 du -s
, si je me sens vraiment anxieux.
watch
exécute une commande (du -s
ici) périodiquement (toutes les secondes ici) et affiche la sortie en plein écran.