Erstellen eines Fortschrittsbalkens mit "dialog" aus der rsync-Ausgabe


16

Ich suche nach einer Möglichkeit, die rsync-Ausgabe so zu filtern / umzuleiten, dass sie dem Befehl "dialog --gauge" zugeführt werden kann, damit ich während der Dateisynchronisierung einen gut aussehenden Fortschrittsbalken bekomme. Derzeit habe ich es nur direkt an der Eingabeaufforderung getestet, aber ich plane, dies in einem (Bash-) Shell-Skript zu tun.

Ich habe mich im Internet umgesehen und Kleinigkeiten gefunden, aber mir fehlt immer noch etwas, damit es funktioniert

(Haftungsausschluss: Dies kann ein völlig falscher Ansatz sein und ist eine Monstrosität für Umleitungen / Piping.)

Was ich aktuell zusammengestellt habe:

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

Zuerst habe ich den eigentlichen Befehl rsync mit der Option --progress. Die Ausgabe von rsync wird an awk weitergeleitet und verwendet den folgenden awk-Filter:

{
   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();
}

Dadurch wird die rsync-Ausgabe herausgefiltert und der Prozentsatz im folgenden Format angegeben:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

Um die Dezimalzahlen loszuwerden, füttere ich die Ausgabe mit sed:

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

Was die folgende Ausgabe ergibt:

64
66
68
70
72
74
75
77

Diese Nummern werden wie folgt in den Dialog geleitet:

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

Soweit ich weiß, sollte "dialog --gauge" usw. dies akzeptieren, aber es wird nur ein Fortschritt von 0% angezeigt, bis es plötzlich 100% erreicht.

Kann mich hier jemand in die richtige Richtung weisen? Bin ich weit weg von einer funktionierenden Fortschrittsanzeige? Gibt es einen besseren Weg, dies zu erreichen?

Grüße,

Christer

EDIT : Nach der Einnahme @lynxlynxlynx‘Antwort berücksichtigt, die richtige Befehlszeile ist:

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

1
Klingt so, als ob etwas (wahrscheinlich awk) die Ausgabe puffert, bis das Programm, bevor es in der Pipeline ist, die EOF sendet. Keine Ahnung, wie man das überprüft oder
— angeht

Antworten:


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

Funktioniert gut, also hat @Shadur recht und es wird gepuffert.

Das Hinzufügen des sedStrippers zum Mix zeigt, dass es der Schuldige ist (nur die Anzeigen 0 und 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

Nachdem das Problem bekannt ist, haben Sie mehrere Möglichkeiten. Am saubersten wäre es, den Prozentsatz awkentweder mit Mathematik oder mit Zeichenketten zu runden / zu reduzieren , aber da Sie GNU haben sed, müssen Sie nur den Trick hinzufügen -uoder --unbufferedtun.

Ein einfacher Testfall zeigt jedoch der Vollständigkeit halber awkauch die Pufferung:

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 

Aber damit kommst du schon klar fflush, also erwarte ich keine Probleme.


Beeindruckend..! Tausend Dank! Hinzufügen - ungepuffert zu sed war das einzige, was benötigt wurde! Vielen Dank für Ihre Zeit und Ihr Wissen Shadur & lynxlynxlynx!
— chr1573r

Für andere Leute, die sich fragen, wie der letzte Befehl aussieht: 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 "Hallo, dies ist ein Messgerät-Widget" 20 70
— chr1573r 06.08.12

Kein Problem und willkommen auf der Seite. :)
— Shadur
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.