虽然该pv
解决方案很好地显示了进度,但它没有显示将哪些文件提取到哪里。该--checkpoint=.100
选项显示文件并指示它正在工作,但不显示进度。
在Tar Checkpoints页面上,我找到了有关该--checkpoint-action
选项的一些信息,该选项能够为每个检查点执行一些 bash 魔术。知道每 20 个 512 字节的块创建一个检查点(至少这是默认值,请参阅 参考资料man tar
),可以根据当前块和原始大小获取进度。
下面的代码片段可以保存为 bash 文件(或放入 bash 函数):
archive="$1"
originalsize=$(file $archive | rev | cut -d' ' -f1 | rev)
step=100
blocks=$(echo "$originalsize / 512 / 20 / $step" | bc)
tar -xvz --checkpoint=$step --totals \
--checkpoint-action="exec='p=\$(echo "\$TAR_CHECKPOINT/$blocks" | bc -l);printf \"%.4f%%\r\" \$p'" \
-f $archive
然后使用它非常简单:
bash tarprogress.sh your.archive.tgz