การสร้างแถบความคืบหน้าด้วย“ กล่องโต้ตอบ” จากเอาต์พุต rsync


16

ฉันกำลังมองหาวิธีในการกรอง / เปลี่ยนเส้นทาง rsync ในลักษณะที่สามารถป้อนไปยังคำสั่ง "dialog --gauge" ดังนั้นฉันสามารถดูแถบความคืบหน้าที่ดีในระหว่างการซิงค์ไฟล์ ขณะนี้ฉันเพิ่งทดสอบโดยตรงที่พร้อมท์ แต่ฉันวางแผนที่จะทำในเชลล์สคริปต์ (ทุบตี)

ฉันดูรอบ ๆ อินเทอร์เน็ตและพบบิตและชิ้นส่วน แต่ฉันก็ยังขาดอะไรบางอย่างที่จะทำให้มันใช้งานได้

(ข้อจำกัดความรับผิดชอบ: นี่อาจเป็นวิธีที่ผิดโดยสิ้นเชิงและเป็นการเปลี่ยนเส้นทาง / การวางท่อที่น่าตกใจ)

สิ่งที่ฉันได้รวบรวม:

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 จริงด้วย --progress ตัวเลือกเอาต์พุตจาก 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 

เท่าที่ฉันรู้ "dialog --gauge" เป็นต้นควรยอมรับสิ่งนี้ แต่เพียงแสดงความคืบหน้าเป็น 0% จนกว่าจะถึง 100% ทันที

ใครบางคนชี้ให้ฉันในทิศทางที่ถูกต้องที่นี่? ฉันอยู่ห่างไกลจากแถบความคืบหน้าการทำงานหรือไม่? มีวิธีที่ดีกว่าในการบรรลุเป้าหมายนี้หรือไม่?

ความนับถือ,

Christer

แก้ไข : หลังจากคำตอบ @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
ดูเหมือนว่าบางสิ่ง (น่าจะแปลกใจ) กำลังบัฟเฟอร์เอาต์พุตจนกว่าโปรแกรมก่อนที่จะส่ง EOF Dunno จะตรวจสอบหรือแก้ไขปัญหานี้ได้อย่างไร ...
Shadur

คำตอบ:


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

ทำงานได้ดีดังนั้น @Shadur จึงถูกต้องและมีการบัฟเฟอร์ขณะเล่น

การเพิ่มผู้เป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

เมื่อทราบปัญหาแล้วคุณมีหลายตัวเลือก cleanest จะปัดเศษ / ลดเปอร์เซ็นต์awkด้วยการจัดการทางคณิตศาสตร์หรือสตริง แต่เนื่องจากคุณมี GNU 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แล้วดังนั้นฉันไม่คาดหวังปัญหา


ว้าว..! ขอบคุณหนึ่งล้าน! การเพิ่ม - ไม่น่าไว้วางใจได้เป็นสิ่งเดียวที่จำเป็น! ขอบคุณที่แบ่งปันเวลาและความรู้ของคุณ Shadur & lynxlynxlynx!
chr1573r

สำหรับคนอื่น ๆ ที่สงสัยว่าคำสั่งขั้นสุดท้ายจะเป็นอย่างไร: 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 /' | กล่องโต้ตอบ - หัวเรื่อง "My Gauge" - วัด "สวัสดีนี่เป็นเครื่องมือวัด" 20 70
chr1573r

ไม่มีปัญหาและยินดีต้อนรับสู่เว็บไซต์ :)
Shadur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.