Rsync आउटपुट से "डायलॉग" के साथ एक प्रोग्रेसबार बनाना


16

मैं एक तरह से rsync आउटपुट को फ़िल्टर / रीडायरेक्ट करने का तरीका खोज रहा हूं, जहां इसे "डायलॉग - गेज" कमांड को खिलाया जा सकता है, इसलिए मुझे फाइल सिंक के दौरान एक अच्छी दिखने वाली प्रगति पट्टी मिल सकती है। वर्तमान में मैंने केवल इसे प्रॉम्प्ट पर सीधे परीक्षण किया है, लेकिन मैं इसे (bash) शेल स्क्रिप्ट में करने की योजना बना रहा हूं।

मैंने इंटरनेट के चारों ओर देखा है और बिट्स और टुकड़े पाए हैं, लेकिन मैं अभी भी इसे काम करने के लिए कुछ याद कर रहा हूं

(अस्वीकरण: यह पूरी तरह से गलत दृष्टिकोण हो सकता है, और एक पुनर्निर्देशित / पाइपिंग एकरूपता है)

मैंने वर्तमान में एक साथ क्या रखा है:

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

पहले मेरे पास वास्तविक rsync कमांड है - -प्रोग्रेस विकल्प के साथ rsync से आउटपुट को awk में पाइप किया जाता है और 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();
}

यह rsync आउटपुट को फ़िल्टर करता है और निम्न प्रारूप में प्रतिशत प्रदान करता है:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963

तो दशमलव संख्याओं से छुटकारा पाने के लिए, मैं आउटपुट को sed से फ़ीड करता हूं:

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

जो निम्न आउटपुट देता है:

64
66
68
70
72
74
75
77

उन नंबरों को इस तरह डायलॉग में डाला जाता है:

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

जहां तक ​​मुझे पता है, "संवाद - गेज" आदि को इसे स्वीकार करना चाहिए, लेकिन यह केवल 0% होने तक प्रगति दिखाता है जब तक कि यह अचानक 100% तक नहीं पहुंच जाता है

क्या कोई मुझे यहाँ सही दिशा में ले जा सकता है? क्या मैं एक काम करने वाले प्रोग्रेसबार से बहुत दूर हूं? क्या इसे प्राप्त करने का एक बेहतर तरीका है?

सादर,

क्रिस्टर

EDIT : @lynxlynxlynx के जवाब को ध्यान में रखने के बाद, सही कमांड लाइन है:

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
लगता है जैसे कुछ (शायद जाग) पाइपलाइन में कार्यक्रम से पहले तक आउटपुट बफ़र कर रहा है, इससे पहले कि ईओएफ भेजता है।
डननो

जवाबों:


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

ठीक काम करता है, इसलिए @ बहादुर सही है और खेल में शौकीन है।

sedस्ट्रिपर को मिश्रण में जोड़ने से पता चलता है कि यह अपराधी है (केवल 0 और 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

अब जब समस्या ज्ञात हो गई है, तो आपके पास कई विकल्प हैं। सबसे साफ awkगणित या स्ट्रिंग हेरफेर के साथ प्रतिशत को राउंड / कट करना होगा , लेकिन चूंकि आपके पास जीएनयू है sed, बस जोड़ -uया --unbufferedचाल करना चाहिए।

हालाँकि पूर्णता के लिए, एक साधारण परीक्षण मामला दिखाता है awkकि बफरिंग भी होती है:

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 

लेकिन आप पहले से ही संभाल रहे हैं fflush, इसलिए मुझे समस्याओं की उम्मीद नहीं है।


वाह..! बहुत - बहुत धन्यवाद! जोड़ - जोड़ के लिए sed केवल जरूरत की चीज थी! अपना समय और ज्ञान साझा करने के लिए धन्यवाद Shadur & lynxlynxlynx!
chr1573r

अन्य लोगों को आश्चर्य होता है कि अंतिम कमांड कैसा दिखता है: rsync -avz --progress -e "ssh" user @ server: / home / user / data / / home / user / data | awk -f /home/user/rsync.awk | sed --unbuffered की / ([0-9] *)। * / \ 1 / '| संवाद - शीर्षक "माई गेज" - गेज "हाय, यह एक गेज विजेट है" 20 70
chr1573r

कोई समस्या नहीं है, और साइट पर आपका स्वागत है। :)
शादुर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.