Створення панелі прогресу з "діалогом" з виводу rsync


16

Я шукаю спосіб фільтрувати / перенаправляти вихід rsync таким чином, щоб його можна було подати до команди "dialog --gauge", так що я можу отримати гарну панель прогресу під час синхронізації файлів. Наразі я тестував це лише безпосередньо під час підказки, але я планую це зробити в сценарії (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 з параметром --progress Вихід з rsync переносять у awk та використовують наступний фільтр 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
Здається, що-то (ймовірно, awk) буферизує висновок, поки програма перед ним у конвеєрі не надсилатиме EOF. Не знаю, як це перевірити чи вирішити ...
Шадур

Відповіді:


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

Тепер, коли проблема відома, у вас є кілька варіантів. Найчистішим було б округлення / скорочення відсотка за 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, тому я не очікую проблем.


Ого..! Завдяки мільйонів! Додавання - незаповнений sed був єдине, що потрібно! Дякуємо за те, що поділилися своїм часом та знаннями Шадур та лінкслінкслінкс!
chr1573r

Іншим людям цікаво, як виглядає фінальна команда: rsync -avz --progress -e "ssh" користувач @ сервер: / home / user / data / / home / user / data | awk -f /home/user/rsync.awk | sed - незаповнений 's / ([0-9] *). * / \ 1 /' | dialog --title "My Gauge" --gauge "Привіт, це віджет калібрування" 20 70
chr1573r

Без проблем, і ласкаво просимо на сайт. :)
Шадур
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.