【问题标题】:Formatting piped rsync output for Zenity progress为 Zenity 进度格式化管道 rsync 输出
【发布时间】:2019-11-25 13:25:37
【问题描述】:

我正在执行 rsync 过程以从 SD 卡复制文件,并且我想在每个文件的 rsync 过程中显示 Zenity 中每个文件的进度。我尝试了Zenity and rsync,这对我来说似乎很完美。它应该将当前文件和 % 复制到 Zenity,但我无法得到它,输出不是实时的,也不会移动进度条。而且我不知道为什么它不起作用。

我至少要做的是将文件副本的百分比发送到 Zenity 以驱动进度条。但这需要是一个没有尾随 % 的数字来驱动进度条。

这不会输出任何内容,但如果我删除 sed 和 Zenity 步骤,我会得到:0%、1%、2% 等。但 Zenity 需要非百分比值。

sudo rsync -av  --info=progress2  "$f"/*.MP4 $copydest | \
strace -e trace=read grep "[0-9]*%" 2>&1 > /dev/null | grep -o "[[:digit:]]*%" | sed 's/[^0-9]//g' | \
zenity  --width=400 --height=20 --progress  --percentage=0  --text="Copying...." --auto-close  --auto-kill \
 --title="Copying $tc from  $cardname"

理想情况下,我也希望显示当前文件名,但我被卡住了。例如,

Filename.MP4
.......... (progress)

在 grep 或 sed 或 awk 中必须有一个配方,我可以获取 MP4 文件名和复制的百分比作为数字,但它超出了我的范围。

这是 rsync 将在 3 个文件上输出的内容,其中 % 和剩余时间递增等

25_nn67_P1680210.MP4
  1,024,202,031 100%  163.00MB/s    0:00:05 (xfr#1, to-chk=2/3)
25_nn67_P1680211.MP4
    146,801,421 100%   49.12MB/s    0:00:02 (xfr#2, to-chk=1/3)
25_nn67_P1680212.MP4

【问题讨论】:

    标签: linux bash rsync zenity


    【解决方案1】:

    好的,我修好了,非常感谢 dash-o 提供的格式化帮助 - 很高兴。 问题是管道缓冲,所以 Zenity 在缓冲区满之前没有得到任何数据——这对于我正在运行的测试文件集可能从来没有。 您需要将管道中所有步骤的缓冲区(在 zenity 之前)设置为 0:

    sudo  rsync -av  --info=progress2  "$f"/*.MP4 $copydest | \
    stdbuf -i0 -o0 -e0 tr '\r' '\n' | stdbuf -i0 -o0 -e0  awk -W interactive -f /path/to/rsync.awk |  zenity --progress  --width=400   --text="Copying...." --auto-close --title="Copying $cardname"  
    

    然后在 rsync.awk(它可以在不需要额外文件的情况下工作)添加 fflush() 确保它刷新。

    #!/bin/sh
    /^ / { print int(+$2) ; fflush() ;  next } $0 { print "# " $0  }
    

    所以现在,执行 rsync(通过之前的 Zenity 对话)会导致进度窗口,其中包含当前文件名和移动进度条,同时 Rsync 复制每个文件 - 注意:不是整体进度,而是每个复制的文件发生。

    所以现在我的脚本在插入包含 MP4 文件的 SD 卡时触发,并使用 rsync 进行复制,并带有工作进度条。

    【讨论】:

      【解决方案2】:

      一个相对简单的选项是捕获当前文件和当前文件的百分比:

      rsync -av --info=progress2 ...  |
         tr '\r' '\n' |
         awk '/^ / { print int(+$2) ; next } $0 { print "# " $0 }' |
         zenity --progress ...
      

      【讨论】:

      • 非常感谢您的帮助,我看到#filename 后跟数字(没有 %) - 当我通过 CLI 进行测试时非常棒!但出于某种原因,Zenity 不会读到
      • 这就是我 zenity 的名称:``` zenity --width=400 --height=20 --progress --percentage=0 --text="Copying...." - -auto-close --auto-kill --title="复制$cardname"
      【解决方案3】:

      显示总体完成率更具挑战性。这将需要运行 rsync 两次 - 一次在空运行模式下,计算要移动的文件数,然后使用文件计数来计算进度百分比。

      不用说,这会稍微延迟实际复制。

      以下代码假定所有文件的复制时间都相同。它需要一些工作来执行文件计数的实际估计,因为日志包含很少的其他消息(总字节等)。

      (
      echo "5" ; echo "Calculate job Size"
      file_count=$(rsync --dry-run -av  feature_files/ fff/ | wc -l)
      echo "F=$file_count"
      
      rsync -av --info=progress2 feature_files/ fff/ |
         tr '\r' '\n' |
         awk -v "total=$file_count" '
      /^ / { print 100*(count+$2/100)/total ; next }
      $0 { print "# " $0 ; count++ ; print 100*count/total }
      '
      ) | zenity --progress ...
      

      【讨论】:

      • 实际上我不是在关注整个 rsync 过程,而是关注每个文件,以便在传输发生时对话框将保持打开状态并显示每个进程的进度 - 这有意义吗
      • @Nowski 我已经发布了两个选项,因为我不确定您想要哪个版本。选择适合您要求的!
      • 是的,谢谢,第一个似乎是输出正确格式数据的那个 - 非常感谢,但出于某种原因 Zenity 不会接受它,我会坚持下去 - 再次感谢你,跨度>
      猜你喜欢
      • 2014-12-15
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2013-04-15
      相关资源
      最近更新 更多