1. 想要获取进度,必须知道解压之后总文件的大小

2.下面来获取linux中常用的两种压缩方式,查看解压之后的文件大小

 (1)  tar.xz

   examples.tar.xz     

$xz --robot -l  examples.tar.xz
name    examples.tar.xz
file    1       157     646599460       1966622720      0.329   CRC32   0
totals  1       157     646599460       1966622720      0.329   CRC32   0       1

   646599460  这个是当前压缩文件的大小.1966622720这个解压之后文件大小,我们记为total_size.待会需要用到这个值.

 (2)tar.gz

  examples.tar.gz

$gzip -l examples.tar.gz
         compressed        uncompressed  ratio uncompressed_name
              77736              266240  70.8% examples.tar.gz

   77736    压缩文件大小, 266240 解压之后大小,我们记为 total_size.

3. tar 选项

  (1)   -b, --blocking-factor BLOCKS 

                  BLOCKS x 512 bytes per record

                 这个用于计算一个记录块是大小.是512的倍数

  (2)--checkpoint
           display progress messages every NUMBERth record (default 10)

    这个用进度条显示信息,检测数据点的位置,是record为单位

  (3)--checkpoint-action=ACTION
           execute ACTION on each checkpoint

   这个是每个checkpoint,可以自定义输出你想的信息

4. -b  --checkpoint 参数如何设置

 -b 进度条一般为100%显示.那么计算公式为:(total_size/512)/100+1 = 这个值就是一个record的大小.

  (除512是因为,以512为单位,除100是因为是百分制,即100%进度条,加1是因为小于512的补偿,以防出大于100%的进度)

  --checkpoint 设置为1即可,因为为了方便,所以也不用设置record的倍数了.仔细一想都能理解.

5.附上一个简易脚本

$cat unpack_progress.sh

#!/bin/sh

total_size=`xz --robot -l $1 | grep 'totals' | awk '{print $5}'`

echo "total_size:$total_size"

block_size=`expr $total_size / 51200`
block_size=`expr $block_size + 1`

tar --blocking-factor=$block_size --checkpoint=1 --checkpoint-action='ttyout=unpack %u%    \r' -xvf $1 -C $2

显示效果:
$ ./unpack_progress.sh rootfs.tar.xz ./rootfs > /dev/null
unpack 59%

 

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐