我正在寻找一种方法来过滤/重定向 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
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
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
,所以我预计不会出现问题。