我想打印至少提取的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.首先,您需要安装pv,在 macOS 上可以通过以下方式完成:
brew install pv
Run Code Online (Sandbox Code Playgroud)
将压缩文件通过管道传输pv到tar命令:
pv mysql.tar.gz | tar -xz
Run Code Online (Sandbox Code Playgroud)
这是此命令的示例输出:
对于那些好奇的人,这可以通过pv了解传递给它的文件的总文件大小以及其中有多少“管道”到tar命令来实现。它使用这两件事来确定当前进度、平均速度和预计完成时间。整洁的!
如果你真的想通过文件来做,你可以使用:
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)
与一起提取时,tar可以使用该--checkpoint选项。您得到的实际上不是进度条,而是足以查看进度。
在此示例中,tar将打印一条消息,每写入100条记录。如果在等号后紧接一个点,它将只打印一个.。
tar -xf somearchive.tar.gz --checkpoint=.100
Run Code Online (Sandbox Code Playgroud)
输出:
.......
Run Code Online (Sandbox Code Playgroud)