rsyncの「ダイアログボックス」出力を使用して進行状況バーを作成する

rsyncの「ダイアログボックス」出力を使用して進行状況バーを作成する

ファイル同期中に素晴らしい進行状況バーを取得できるように、 "dialog --gauge"コマンドに供給できるように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

まず、--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

したがって、小数点以下の桁数を取り除くために出力を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

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があるので、orを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ので問題にならないと予想されます。

おすすめ記事