Hacer una barra de progreso con "diálogo" desde la salida rsync

16

Estoy buscando una manera de filtrar / redirigir la salida de rsync de manera que se pueda alimentar al comando "dialog - calibre", para que pueda obtener una barra de progreso de aspecto agradable durante la sincronización de archivos. Actualmente solo lo he probado directamente en el indicador, pero estoy planeando hacerlo en un script de shell (bash).

Busqué en Internet y encontré partes y piezas, pero todavía me falta algo para que funcione

(Descargo de responsabilidad: este podría ser un enfoque totalmente incorrecto y es una monstruosidad de redirección / canalización)

Lo que he reunido actualmente:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data | awk -f /home/user/rsync.awk | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

Primero tengo el comando rsync real con la opción --progress La salida de rsync se canaliza a awk y usa el siguiente filtro awk:

{
   if (index($0, "to-check=") > 0)
   {
        split($0, pieces, "to-check=")
        split(pieces[2], term, ")");
        split(term[1], division, "/");
        print (1-(division[1]/division[2]))*100
}
#   else
#   {
#       print "#"$0;
#   }
   fflush();
}

Esto filtra la salida rsync y proporciona el porcentaje en el siguiente formato:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

Entonces, para deshacerme de los números decimales, alimento la salida a sed:

sed 's/\([0-9]*\).*/\1/'

Lo que da el siguiente resultado:

64
66
68
70
72
74
75
77

Esos números se canalizan en un diálogo como este:

dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

Hasta donde yo sé, "dialog --gauge" etc. debería aceptar esto, pero solo muestra que el progreso es 0% hasta que de repente alcanza el 100%

¿Alguien puede señalarme en la dirección correcta aquí? ¿Estoy lejos de una barra de progreso que funcione? ¿Hay una mejor manera de lograr esto?

Saludos,

Christer

EDITAR : después de tener en cuenta la respuesta de @lynxlynxlynx, la línea de comando correcta es:

rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data \ 
 | awk -f /home/user/rsync.awk \ 
 | sed --unbuffered 's/([0-9]*).*/\1/' \ 
 | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70
chr1573r
fuente
1
Parece que algo (probablemente awk) está almacenando la salida en el búfer hasta que el programa antes de que esté en la tubería envíe el EOF. No sé cómo comprobar o abordar esto, aunque ...
Shadur

Respuestas:

12
for i in 10 20 30; do echo $i; sleep 1; done | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

funciona bien, por lo que @Shadur tiene razón y hay buffering en juego.

Agregar el sedseparador a la mezcla muestra que es el culpable (solo muestra 0 y 30):

for i in 10 20 30; do echo $i; sleep 1; done | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70

Ahora que se conoce el problema, tiene múltiples opciones. Lo más limpio sería redondear / reducir el porcentaje awkya sea con manipulación matemática o de cadena, pero dado que tiene GNU sed, simplemente agregar -uo --unbuffereddebería hacer el truco.

Sin embargo, en aras de la integridad, un caso de prueba simple muestra que awktambién hace buffering:

for i in 10 20 30; do echo $i; sleep 1; done | awk '{print $0}' | sed -u 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 

Pero ya manejas eso fflush, así que no espero problemas.

lynxlynxlynx
fuente
Guau..! ¡Un millón de gracias! ¡Agregar --unbuffer a sed era lo único que se necesitaba! ¡Gracias por compartir su tiempo y conocimiento Shadur y lynxlynxlynx!
chr1573r
Para otras personas que se preguntan cómo se ve el comando final: rsync -avz --progress -e "ssh" user @ server: / home / user / data / / home / user / data | awk -f /home/user/rsync.awk | sed --unbuffered 's / ([0-9] *). * / \ 1 /' | cuadro de diálogo --título "Mi indicador" - indicador "Hola, este es un widget de indicador" 20 70
chr1573r
No hay problema, y ​​bienvenido al sitio. :)
Shadur