Linux
從 rsync 輸出中使用“對話框”製作進度條
我正在尋找一種過濾/重定向 rsync 輸出的方法,以將其提供給“dialog –gauge”命令,這樣我就可以在文件同步期間獲得一個漂亮的進度條。目前我只在提示符下直接對其進行了測試,但我打算在(bash)shell 腳本中執行此操作。
我瀏覽了網際網路並找到了一些零碎的東西,但我仍然缺少一些使它起作用的東西
(免責聲明:這可能是一種完全錯誤的方法,並且是重定向/管道怪物)
我目前匯總的內容:
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”等應該接受這一點,但它只是顯示進度為 0%,直到它突然達到 100%
有人可以在這裡指出我正確的方向嗎?我離工作進度條很遠嗎?有沒有更好的方法來實現這一目標?
問候,
克里斯特
編輯:考慮到@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
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
最乾淨的方法是使用數學或字元串操作來舍入/減少百分比,但既然你有 GNUsed
,只需添加-u
or--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
,所以我不希望出現問題。