如何将进度条添加到somearchive.tar.xz提取

时间:2013-10-15 02:32:35

标签: bash tar

我想打印至少提取的print#文件,运行tarball提取

xz -dc /path/to/somearchive.tar.xz | sudo tar xvpf - -C /path/to/some_directory

我正在考虑使用this question中提到的“\ r”,例如

num=0
when [\n received]
    num=$(($num + 1))
    echo -ne "$num files extracted \r"
end when

我的bash技能让我失望。

5 个答案:

答案 0 :(得分:7)

如果你真的想通过文件来做,你可以使用:

tar xvpf /path/to/archive.tar.xz -C /path/to/dir 2>&1 | 
while read line; do
    x=$((x+1))
    echo -en "$x extracted\r"
done

注意:

  • 您可能不需要单独xz,大多数tar实施会自动为您检测并解压缩。
  • 默认情况下,
  • tar从标准输入读取,您不需要f -

您应该考虑使用pv,它更精确,更普遍适用:

pv /path/to/archive.tar.xz | tar xp -C /path/to/dir

答案 1 :(得分:4)

使用tar进行提取时,您可以使用--checkpoint选项。你得到的并不是一个真正的进步条,但足以看到进展。

在此示例中,tar将每写入100条记录打印一条消息。如果您在等号后面立即放置一个点,它将只打印.

tar -xf somearchive.tar.gz --checkpoint=.100

输出:

.......

答案 2 :(得分:1)

您可以使用以下xz文件执行此操作:

unxz -v --stdout file.tar.xz | tar -x

答案 3 :(得分:1)

使用pv将文件通过管道传输到tar

  1. 首先,您需要安装pv,这可以在macOS上完成:

    brew install pv
    
  2. 使用pv将压缩文件放入tar命令:

    pv mysql.tar.gz | tar -xz   
    

这是此命令的示例输出:

Sample output

对于那些好奇的人来说,这可以通过pv来了解,您知道传递给它的文件的总文件大小以及其中有多少文件已“管道传输”到tar命令中。它使用这两件事来确定当前进度,平均速度和估计的完成时间。干净!

答案 4 :(得分:0)

尽管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