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
Respuestas:
funciona bien, por lo que @Shadur tiene razón y hay buffering en juego.
Agregar el
sed
separador a la mezcla muestra que es el culpable (solo muestra 0 y 30):Ahora que se conoce el problema, tiene múltiples opciones. Lo más limpio sería redondear / reducir el porcentaje
awk
ya sea con manipulación matemática o de cadena, pero dado que tiene GNUsed
, simplemente agregar-u
o--unbuffered
debería hacer el truco.Sin embargo, en aras de la integridad, un caso de prueba simple muestra que
awk
también hace buffering:Pero ya manejas eso
fflush
, así que no espero problemas.fuente