使用rsync输出的“对话框”制作进度条


16

我正在寻找一种过滤/重定向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

1
听起来有些东西(可能是awk)正在缓冲输出,直到流水线中的程序发送EOF为止。邓诺
Dunno)

Answers:


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 2012年

其他人想知道最终命令是什么样的: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 /'| 对话框--title“我的仪表” --gauge“嗨,这是一个仪表小部件” 20 70
chr1573r 2012年

没问题,欢迎光临本站。:)
Shadur
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.