我想打印至少提取的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技能让我失望。
答案 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
。首先,您需要安装pv
,这可以在macOS上完成:
brew install pv
使用pv
将压缩文件放入tar
命令:
pv mysql.tar.gz | tar -xz
这是此命令的示例输出:
对于那些好奇的人来说,这可以通过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