Solución 1:
Ahora hay una forma oficial de hacer esto en rsync (versión 3.1.0 del protocolo versión 31, probado 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)
Probé con mi /usr
carpeta porque quería esta función para transferir sistemas de archivos completos, y /usr
parecía ser una buena muestra representativa.
El --info=progress2
da un buen porcentaje general, incluso si es solo un valor parcial. De hecho, mi /usr
la carpeta tiene más de 6 gigas:
#> du -sh /usr
6,6G /usr/
y rsync
tomó mucho tiempo para escanear todo. Entonces, casi todo el tiempo, el porcentaje que he visto fue completado en un 90%, pero no obstante, es reconfortante ver que algo se está copiando :)
Referencias:
- https://stackoverflow.com/a/7272339/1396334
- https://download.samba.org/pub/rsync/NEWS#3.1.0
Solución 2:
Lo siguiente se aplica a la versión 3.0.0 y superior de rsync. Las opciones que se describen a continuación se introdujeron en esa versión el 1 de marzo de 2008.
Junto con --info=progress2 también puede usar --no-inc-recursive opción (o su forma más corta --no-i-r alias) para deshabilitar la recursividad incremental.
Esto creará la lista completa de archivos al principio, en lugar de descubrir más archivos de forma incremental a medida que avanza la transferencia. Dado que conocerá todos los archivos antes de comenzar, brindará un mejor informe del progreso general. Esto se aplica a la cantidad de archivos; no informa ningún progreso según el tamaño de los archivos.
Esto implica un intercambio. Crear toda la lista de archivos antes de tiempo consume más memoria y puede retrasar significativamente el inicio de la transferencia real. Como era de esperar, cuantos más archivos haya, mayor será el retraso y más memoria requerirá.
Lo siguiente es del manual de rsync (fuente:http://rsync.samba.org/ftp/rsync/rsync.html):
-r, --recursivo
Esto le dice a rsync que copie los directorios recursivamente. Véase también --dirs (-d). A partir de rsync 3.0.0, el algoritmo recursivo que se usa ahora es un escaneo incremental que usa mucha menos memoria que antes y comienza la transferencia después de que se haya completado el escaneo de los primeros directorios. Este escaneo incremental solo afecta nuestro algoritmo recursivo y no cambia una transferencia no recursiva. También es posible solo cuando ambos extremos de la transferencia tienen al menos la versión 3.0.0.
Algunas opciones requieren que rsync conozca la lista completa de archivos, por lo que estas opciones deshabilitan el modo de recursión incremental. Estos incluyen:--delete-before, --delete-after, --prune-empty-dirs y --delay-updates. Debido a esto, el modo de eliminación predeterminado cuando especifica --delete ahora es --delete-durante cuando ambos extremos de la conexión son al menos 3.0.0 (utilice --del o --delete-durante para solicitar este modo de eliminación mejorado explícitamente). Vea también la opción --delete-delay que es una mejor opción que usar --delete-after.
La recursividad incremental se puede deshabilitar mediante --no-inc-recursive opción o su forma más corta --no-i-r alias.
Consulte también https://rsync.samba.org para conocer las diferencias de versión específicas (desplácese hacia abajo y consulte los enlaces de Noticias de lanzamiento).
Solución 3:
Puedes con 'pv' (apt-get install pv
con Debian y ubuntu). Recomiendo controlar la cantidad de archivos transferidos, ya que la cantidad de datos transferidos no está correlacionada con el tamaño de los archivos sino con el delta entre el origen y el destino. Y contar archivos contará el mismo progreso para un delta grande y otro con delta pequeño. Lo que significa que, en cualquier caso, la estimación de ETA podría estar muy lejos. La ETA basada en el tamaño solo funciona si su destino está vacío, en este caso delta ==tamaño de la fuente.
La idea general es emitir una línea por archivo 'transferido' desde rsync y contar esas líneas con 'pv':
rsync -ai /source remote:/dest | pv -les [number of files] >/dev/null
Tiendo a hacer copias de seguridad de sistemas de archivos completos (por varias razones), en este caso puede usar el mucho más económico df
para obtener el número de archivos (en lugar de du
o find
que atravesará su jerarquía de fuentes en otro momento después de que rsync lo haya hecho). Aparece la opción -x para asegurarse de que rsync permanece en el mismo sistema de archivos de origen (y no sigue otros montajes internos):
rsync -aix /source remote:/dest | pv -les $(df -i /source | perl -ane 'print $F[2] if $F[5] =~ m:^/:') >/dev/null
Si desea contar archivos en /source de forma general, use find /source|wc -l
(Advertencia de nuevo:puede ser lento y pesado en E/S).
Solución 4:
danakim es correcto. No hay formas triviales de agregar un indicador de progreso total.
La razón de esto es que cuando rsync mira una lista de archivos para sincronizar, no sabe de antemano qué archivos necesitarán cambiar. Si está realizando transferencias delta, los deltas mismos deben calcularse con anticipación para brindar una imagen total del trabajo que debe realizarse.
En otras palabras, la forma más fácil de calcular cuánto trabajo hay que hacer es realmente hacerlo.
Solución 5:
Para transferencias largas, estoy contento con ejecutar du -s
a ambos lados. Incluso watch -n1 du -s
, si me siento realmente ansioso.
watch
ejecuta un comando (du -s
aquí) periódicamente (cada 1 segundo aquí) y muestra la salida a pantalla completa.