Membuat progressbar dengan "dialog" dari rsync output

16

Saya mencari cara untuk memfilter / mengarahkan ulang output rsync dengan cara di mana ia dapat diumpankan ke perintah "dialog --gauge", jadi saya bisa mendapatkan progressbar yang tampak bagus selama sinkronisasi file. Saat ini saya hanya mengujinya secara langsung di prompt, tapi saya berencana untuk melakukan ini dalam skrip shell (bash).

Saya telah mencari di internet dan menemukan potongan-potongan, tapi saya masih kehilangan sesuatu untuk membuatnya bekerja

(Penafian: Ini mungkin pendekatan yang benar-benar salah, dan merupakan redstant / piping monstrosity)

Apa yang saat ini saya kumpulkan:

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

Pertama saya memiliki perintah rsync aktual dengan opsi --progress Output dari rsync disalurkan ke awk dan menggunakan filter followng 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();
}

Ini menyaring keluaran rsync dan memberikan persentase dalam format berikut:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

Jadi untuk menghilangkan angka desimal, saya memberi makan output ke sed:

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

Yang menghasilkan output sebagai berikut:

64
66
68
70
72
74
75
77

Angka-angka itu disalurkan ke dialog seperti ini:

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

Sejauh yang saya tahu, "dialog --gauge" dll harus menerima ini, tetapi hanya menampilkan kemajuan menjadi 0% sampai tiba-tiba mencapai 100%

Bisakah seseorang mengarahkan saya ke arah yang benar di sini? Apakah saya jauh dari progressbar yang berfungsi? Apakah ada cara yang lebih baik untuk mencapai ini?

Salam,

Christer

EDIT : Setelah memperhitungkan jawaban @lynxlynxlynx, baris perintah yang benar adalah:

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
sumber
1
Kedengarannya seperti sesuatu (mungkin awk) adalah buffering output sampai program sebelum di pipeline mengirim EOF. Entah bagaimana cara memeriksa atau mengatasi ini, ...
Shadur

Jawaban:

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

berfungsi dengan baik, jadi @Shadur benar dan ada buffering yang sedang dimainkan.

Menambahkan sedstripper ke dalam campuran menunjukkan itu penyebabnya (hanya menunjukkan 0 dan 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

Sekarang masalahnya diketahui, Anda memiliki beberapa opsi. Yang terbersih adalah untuk membulatkan / memotong persentase awkdengan manipulasi matematika atau string, tetapi karena Anda memiliki GNU sed, cukup tambahkan -uatau --unbufferedlakukan triknya.

Namun demi kelengkapan, sebuah test case yang sederhana awkjuga menunjukkan 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 

Tapi Anda sudah mengatasinya fflush, jadi saya tidak mengharapkan masalah.

lynxlynxlynx
sumber
Wow..! Terima kasih banyak! Menambahkan --unbuffered ke sed adalah satu-satunya hal yang diperlukan! Terima kasih telah berbagi waktu dan pengetahuan Anda Shadur & lynxlynxlynx!
chr1573r
Untuk orang lain bertanya-tanya seperti apa bentuk perintah terakhir: 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 "Hai, ini widget gauge" 20 70
chr1573r
Tidak masalah, dan selamat datang di situs ini. :)
Shadur