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

chr*_*73r 16 linux scripting bash awk 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
Run Code Online (Sandbox Code Playgroud)

首先,我有带有 --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();
}
Run Code Online (Sandbox Code Playgroud)

这会过滤掉 rsync 输出并提供以下格式的百分比:

53.7037
55.5556
57.4074
59.2593
61.1111
62.963
Run Code Online (Sandbox Code Playgroud)

因此,为了摆脱十进制数字,我将输出提供给 sed:

sed 's/\([0-9]*\).*/\1/'
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:

64
66
68
70
72
74
75
77
Run Code Online (Sandbox Code Playgroud)

这些数字通过管道传输到对话框中,如下所示:

dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70 
Run Code Online (Sandbox Code Playgroud)

据我所知,"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
Run Code Online (Sandbox Code Playgroud)

lyn*_*ynx 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
Run Code Online (Sandbox Code Playgroud)

工作正常,所以@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
Run Code Online (Sandbox Code Playgroud)

既然问题是已知的,那么您有多种选择。最干净的方法是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 
Run Code Online (Sandbox Code Playgroud)

但是你已经用 处理了fflush,所以我不希望有问题。