17

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

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

例如,我正在考虑使用这个问题中提到的“\r”

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

我的 bash 技能让我失望。

4

5 回答 5

31

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

  1. 首先,您需要安装pv,在 macOS 上可以通过以下方式完成:

    brew install pv
    
  2. 将压缩文件通过管道pv传输到tar命令:

    pv mysql.tar.gz | tar -xz   
    

这是此命令的示例输出:

样本输出

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

于 2020-11-24T21:29:38.053 回答
26

与您一起提取时,tar可以使用该--checkpoint选项。你得到的并不是真正的进度条,而是足以看到进度。

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

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

输出:

.......
于 2018-04-07T10:59:54.947 回答
11

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

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
于 2013-10-15T02:54:07.647 回答
1

您可以使用这样的 xz 文件执行此操作:

unxz -v --stdout file.tar.xz | tar -x
于 2020-04-20T12:03:49.767 回答
1

虽然该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
于 2019-10-25T10:09:03.533 回答