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
Antworten:
Funktioniert gut, also hat @Shadur recht und es wird gepuffert.
Das Hinzufügen des
sed
Strippers zum Mix zeigt, dass es der Schuldige ist (nur die Anzeigen 0 und 30):Nachdem das Problem bekannt ist, haben Sie mehrere Möglichkeiten. Am saubersten wäre es, den Prozentsatz
awk
entweder mit Mathematik oder mit Zeichenketten zu runden / zu reduzieren , aber da Sie GNU habensed
, müssen Sie nur den Trick hinzufügen-u
oder--unbuffered
tun.Ein einfacher Testfall zeigt jedoch der Vollständigkeit halber
awk
auch die Pufferung:Aber damit kommst du schon klar
fflush
, also erwarte ich keine Probleme.quelle