我想至少打印从运行 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 技能让我失败了。
pv
将文件通过管道传送到 tar
。首先,您需要安装
pv
,在 macOS 上可以通过以下方式完成:
brew install pv
在 Debian 或 Ubuntu 上,可以通过以下方式完成:
apt install pv
(感谢 @hyperbola!)。
使用
pv
将压缩文件通过管道传输到 tar
命令:
pv mysql.tar.gz | tar -xz
这是此命令的示例输出:
对于那些好奇的人来说,这是通过
pv
了解您传递给它的文件的总文件大小以及其中多少内容已通过“管道”传输到 tar
命令来实现的。它使用这两件事来确定当前进度、平均速度和预计完成时间。整齐!
使用
tar
提取时,您可以使用 --checkpoint
选项。你得到的并不是真正的进度条,但足以看到进度。
在此示例中,
tar
将每写入 100 条记录就打印一条消息。如果您在等号后立即放置一个点,它只会打印一个 .
。
tar -xf somearchive.tar.gz --checkpoint=.100
输出:
.......
如果你真的想通过文件来完成它,你可以使用:
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
虽然
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
您可以使用 xz 文件执行此操作,如下所示:
unxz -v --stdout file.tar.xz | tar -x