Szukam sposobu na filtrowanie / przekierowywanie danych wyjściowych rsync w sposób, w którym można je podawać do polecenia „dialog -gauge”, aby uzyskać ładnie wyglądający pasek postępu podczas synchronizacji plików. Obecnie testowałem to tylko bezpośrednio po znaku zachęty, ale planuję to zrobić w skrypcie powłoki (bash).
Rozejrzałem się po Internecie i znalazłem kawałki, ale wciąż brakuje mi czegoś, co sprawi, że zadziała
(Zastrzeżenie: To może być całkowicie niewłaściwe podejście i jest to potworność przekierowania / potoku)
Co aktualnie skompletowałem:
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
Najpierw mam rzeczywistą komendę rsync z opcją --progress Dane wyjściowe z rsync są przesyłane do awk i wykorzystują następujący filtr 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();
}
To odfiltrowuje dane wyjściowe rsync i podaje wartość procentową w następującym formacie:
53.7037
55.5556
57.4074
59.2593
61.1111
62.963
Aby pozbyć się liczb dziesiętnych, przesyłam dane wyjściowe do sed:
sed 's/\([0-9]*\).*/\1/'
Co daje następujące dane wyjściowe:
64
66
68
70
72
74
75
77
Te liczby są przesyłane do okna dialogowego w następujący sposób:
dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70
O ile mi wiadomo, „dialog - wskaźnik” itp. Powinien to zaakceptować, ale wyświetla tylko postęp w wysokości 0%, aż nagle osiągnie 100%
Czy ktoś może skierować mnie tutaj we właściwym kierunku? Czy jestem daleko od działającego paska postępu? Czy istnieje lepszy sposób na osiągnięcie tego?
Pozdrowienia,
Christer
EDYCJA : Po uwzględnieniu odpowiedzi @lynxlynxlynx poprawny wiersz poleceń to:
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
Odpowiedzi:
działa dobrze, więc @Shadur ma rację i buforowanie jest odtwarzane.
Dodanie
sed
strippera do miksu pokazuje, że jest to winowajcą (pokazuje tylko 0 i 30):Teraz, gdy problem jest znany, masz wiele opcji. Najczystszym rozwiązaniem byłoby zaokrąglanie / zmniejszanie procentu za
awk
pomocą operacji matematycznych lub łańcuchowych, ale ponieważ masz GNUsed
, po prostu dodaj-u
lub--unbuffered
powinieneś załatwić sprawę.Jednak ze względu na kompletność, prosty przypadek testowy pokazuje
awk
również buforowanie:Ale już sobie z tym poradzisz
fflush
, więc nie oczekuję problemów.źródło