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

最初に--progressオプションを指定した実際のrsyncコマンドがあります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

10進数を取り除くために、出力を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」などはこれを受け入れる必要がありますが、突然100%に達するまで0%の進行状況を表示するだけです。

誰かが私をここで正しい方向に向けることができますか?進行中のプログレスバーから遠く離れていますか?これを達成するためのより良い方法はありますか?

よろしく、

クリスター

編集:@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を送信するまで、何か(おそらくawk)が出力をバッファリングしているように聞こえます。
ダンノ

回答:


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に--unbufferedを追加することだけです!あなたの時間と知識を共有してくれてありがとう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 /' | ダイアログ-タイトル「私のゲージ」
chr1573r

問題ありません。サイトへようこそ。:)
シャドゥール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.