我正在执行 rsync 过程以从 SD 卡复制文件,我想在 rsync 过程中显示每个文件中每个文件的进度。我尝试了Zenity和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
好的,我修复了它,非常感谢 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 复制,带有工作进度条。
一个相对简单的选项是捕获当前文件和当前文件的百分比:
rsync -av --info=progress2 ... |
tr 'r' 'n' |
awk '/^ / { print int(+$2) ; next } $0 { print "# " $0 }' |
zenity --progress ...
显示整体完成率更具挑战性。这将需要运行两次 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 ...