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

问题描述 投票:0回答:6

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

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

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

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

我的 bash 技能让我失败了。

bash tar
6个回答
65
投票

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

  1. 首先,您需要安装

    pv
    ,在 macOS 上可以通过以下方式完成:

    brew install pv
    

    在 Debian 或 Ubuntu 上,可以通过以下方式完成:

    apt install pv
    (感谢 @hyperbola!)。

  2. 使用

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

    pv mysql.tar.gz | tar -xz   
    

这是此命令的示例输出:

对于那些好奇的人来说,这是通过

pv
了解您传递给它的文件的总文件大小以及其中多少内容已通过“管道”传输到
tar
命令来实现的。它使用这两件事来确定当前进度、平均速度和预计完成时间。整齐!


42
投票

使用

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

在此示例中,

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

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

输出:

.......

14
投票

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

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
    默认从 stdin 读取,您不需要
    f -

您应该考虑使用

pv
来代替,它更精确且更普遍适用:

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

5
投票

虽然

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

2
投票

您可以使用 xz 文件执行此操作,如下所示:

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

0
投票

还有progress,你可以这样使用:

tar xp -C /path/to/dir & progress -mp $!

甚至:

watch progress -q
© www.soinside.com 2019 - 2024. All rights reserved.