实现该功能需要安装 pv,然后把需要处理的数据通过管道传给 pv,最后再进行操作。
传给 pv 的目的是为了知道已经处理的数据量大小,同时需要通过 -s 指定总共需要处理的数据量大小。
pv 的安装一般的软件管理工具都有提供:
安装pv
代码语言:javascript复制$ sudo yum install pv
pv 的详细用法可参考:https://linux.die.net/man/1/pv
准备测试目录
准备一个测试压缩的目录test,里面放了连个文本文件1.txt和2.txt
代码语言:javascript复制[root@localhost tar_pv]# ls test
1.txt 2.txt
压缩文件
代码语言:javascript复制$ tar -cf - test | pv -s $(du -sk test | awk '{print $1}') | gzip > test.tar.gz
实际操作
代码语言:javascript复制[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。
解压缩
代码语言:javascript复制$ pv test.tar.gz | tar -zxf -
实际操作
代码语言:javascript复制[root@localhost ~]# pv test.tar.gz | tar -zxf -
173 B 0:00:00 [ 5MiB/s] [==================================================================================================>] 100%
[root@localhost ~]#
命令详解:通过 pv 读取需要解压的文件到 stdout,然后通过管道传递给 tar 命令,tar 命令从标准输入获取要处理的数据进行解压。
本文由 小马哥 创作,采用 知识共享署名4.0 国际许可协议进行许可