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

Gla*_*ost 5 bash tar

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

xz -dc /path/to/somearchive.tar.xz | sudo tar xvpf - -C /path/to/some_directory
Run Code Online (Sandbox Code Playgroud)

我在考虑使用作为中提到的"\ r"的这个问题,例如

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

我的bash技能让我失望.

Jos*_*ter 15

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

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

    brew install pv
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将压缩文件通过管道传输pvtar命令:

    pv mysql.tar.gz | tar -xz   
    
    Run Code Online (Sandbox Code Playgroud)

这是此命令的示例输出:

样本输出

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

  • `pv“$SOURCE_FILE”| xz -0 --stdout > "$TARGET_FILE"`,以防有人尝试使用 `xz` 进行“压缩”。是的,这与OP正在做的相反,但这就是_I_正在寻找的:) (2认同)

Kev*_*vin 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
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 您可能不需要xz单独使用,大多数tar实现会自动检测并解压缩它.
  • tar默认情况下从stdin读取,您不需要f -.

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

pv /path/to/archive.tar.xz | tar xp -C /path/to/dir
Run Code Online (Sandbox Code Playgroud)


小智 6

虽然该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
Run Code Online (Sandbox Code Playgroud)

那么使用起来就非常简单了:

bash tarprogress.sh your.archive.tgz
Run Code Online (Sandbox Code Playgroud)


ser*_*gej 5

与一起提取时,tar可以使用该--checkpoint选项。您得到的实际上不是进度条,而是足以查看进度。

在此示例中,tar将打印一条消息,每写入100条记录。如果在等号后紧接一个点,它将只打印一个.

tar -xf somearchive.tar.gz --checkpoint=.100
Run Code Online (Sandbox Code Playgroud)

输出:

.......
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不适用于带有 gnu tar v1.30 的 centos 版本 8。在 gnu tar 上有效的是:`tar xvnf archive.tgz --checkpoint=1000 --checkpoint-action=dot`。这是在 [v1.20](http://git.savannah.gnu.org/cgit/tar.git/tree/NEWS#n781) 中引入的 (3认同)