使用tar+pv 命令实现压缩和解压缩显示进度条

/ 默认分类 / 没有评论 / 98浏览

实现该功能需要安装 pv,然后把需要处理的数据通过管道传给 pv,最后再进行操作。

传给 pv 的目的是为了知道已经处理的数据量大小,同时需要通过 -s 指定总共需要处理的数据量大小。

pv 的安装一般的软件管理工具都有提供:

安装pv

$ sudo yum install pv

pv 的详细用法可参考:https://linux.die.net/man/1/pv

准备测试目录

准备一个测试压缩的目录test,里面放了连个文本文件1.txt和2.txt

[root@localhost tar_pv]# ls test
1.txt  2.txt

压缩文件

$ tar -cf - test | pv -s $(du -sk test | awk '{print $1}') | gzip > test.tar.gz

实际操作

[root@localhost ~]# tar -cf - test | pv -s $(du -sk test | awk '{print $1}') | gzip > test.tar.gz
  10kiB 0:00:00 [ 256MiB/s] [================================================================================================] 85333%            
[root@localhost ~]# 
[root@localhost ~]# ll
total 21648
drwxr-xr-x 2 root root     4096 Nov  4 14:28 test
-rw-r--r-- 1 root root      173 Nov  4 15:48 test.tar.gz
[root@localhost ~]# tar -tvf test.tar.gz 
drwxr-xr-x root/root         0 2021-11-04 14:28 test/
-rw-r--r-- root/root         4 2021-11-04 14:13 test/1.txt
-rw-r--r-- root/root         5 2021-11-04 14:14 test/2.txt
[root@localhost ~]# 

命令详解:

tar -cf -f 是指定目标文件, - , 代表将需要压缩的数据输出到 stdout(标准输出),这样管道的后面才可以接收到需要处理的数据。

pv 命令的作用是,将输入复制一遍然后输出到 stdout,这样最后的 gzip 命令才有数据可以处理,最后通过 gzip 命令把前面的输出处理之后保存到 test.tar.gz。

pv -s 后面一串的命令是获取需要处理的所有数据的大小(单位:字节),mac 下 du -sk 获取到的数值是以 k 为单位的,而其他 *nix 系统则不一样,参数需要改为 du -sb,同时也不需要再乘以 1024。

解压缩

$ pv test.tar.gz | tar -zxf -

实际操作

[root@localhost ~]# pv test.tar.gz | tar -zxf -
 173 B 0:00:00 [   5MiB/s] [==================================================================================================>] 100%            
[root@localhost ~]# 

命令详解:通过 pv 读取需要解压的文件到 stdout,然后通过管道传递给 tar 命令,tar 命令从标准输入获取要处理的数据进行解压。