Rsync çıktısından "iletişim kutusu" ile bir ilerleme çubuğu oluşturma


16

Ben dosya senkronizasyonu sırasında güzel görünümlü bir ilerleme çubuğu alabilirsiniz, böylece "diyalog --gauge" komutuna beslenebilir bir şekilde rsync çıktı filtre / yönlendirme bir yol arıyorum. Şu anda sadece doğrudan bilgi isteminde test ettim, ama bunu bir (bash) kabuk betiğinde yapmayı planlıyorum.

İnternete baktım ve parçalar ve parçalar buldum, ama hala çalışmasını sağlayacak bir şey eksik

(Feragatname: Bu tamamen yanlış bir yaklaşım olabilir ve bir yönlendirme / borulama canavarlığıdır)

Şu anda ne bir araya getirdim:

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

İlk olarak --progress seçeneği ile gerçek rsync komutu var rsync çıktı awk içine borulu ve followng awk filtre kullanır:

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

Bu, rsync çıktısını filtreler ve yüzdeyi aşağıdaki biçimde sağlar:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

Ondalık sayılardan kurtulmak için çıktıyı sed'e besliyorum:

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

Hangi aşağıdaki çıktıyı verir:

64
66
68
70
72
74
75
77

Bu sayılar aşağıdaki gibi iletişim kutusuna eklenir:

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

Bildiğim kadarıyla, "dialog --gauge" vb. Bunu kabul etmeli, ancak aniden% 100'e ulaşıncaya kadar ilerlemeyi% 0 olarak gösteriyor

Birisi beni burada doğru yöne yönlendirebilir mi? Çalışan bir ilerleme çubuğundan uzak mıyım? Bunu başarmanın daha iyi bir yolu var mı?

Saygılarımızla,

Christer

EDIT : @lynxlynxlynx 'cevabını dikkate aldıktan sonra, doğru komut satırı:

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
Bir şey (muhtemelen awk), boru hattındaki program EOF göndermeden önce çıktıyı arabelleğe alıyor gibi görünüyor. Yine de, bu kontrol veya mücadele nasıl ...
Shadur

Yanıtlar:


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

iyi çalışıyor, bu yüzden @Shadur haklı ve oyunda tamponlama var.

Sıyırıcıyı sedkarışıma eklemek suçlu olduğunu gösterir (sadece 0 ve 30'u gösterir):

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

Artık sorun bilindiğine göre, birden fazla seçeneğiniz var. En temiz olanı, yüzdeyi awkmatematik veya dize manipülasyonuyla yuvarlamak / kesmek olacaktır , ancak GNU'nuz olduğundan sed, sadece ekleme -uveya --unbufferedhile yapmalıdır.

Ancak tamlık uğruna, basit bir test örneği awkde arabelleğe alma işlemini gösterir :

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 

Ama bunu zaten hallediyorsun fflush, bu yüzden problem beklemiyorum.


Vay..! Milyonlarca kez teşekkürler! Sed için - unbuffered eklenmesi gereken tek şeydi! Zaman ve bilginizi paylaştığınız için teşekkür ederiz Shadur & lynxlynxlynx!
chr1573r

Son komutun neye benzediğini merak eden diğer insanlar için: rsync -avz --progress -e "ssh" user @ server: / home / user / data / / home / user / data | awk -f /ho//user/rsync.awk | sed - unbuffered 's / ([0-9] *). * / \ 1 /' | dialog --title "My Gauge" --gauge "Merhaba, bu bir gösterge widget'ı" 20 70
chr1573r

Sorun değil ve siteye hoş geldiniz. :)
Shadur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.