0%

Linux运维学习笔记:文件打包压缩工具

写在前面

这则笔记主要整理Linux文件压缩与打包方面的知识,主要包括以下内容:

  • 常见压缩工具介绍

  • 打包工具

  • 进阶知识:如何压缩/解压缩超过4G的大文件

  • 不解压查看压缩包内容

常见压缩工具介绍

压缩工具 优点 缺点 使用场景
zip 资历最老,linux各种版本都支持,可以压缩目录 压缩比、压缩时间都不占优势 基本上是‘老油条’,哪儿都能用,但是不好用
gzip 优势是速度快,压缩比还不错,内存占用小,centos默认安装 压缩比不高,不支持目录压缩 在内存比较小的建议使用
bzip2 压缩比gzip高 压缩时间长;内存占用比gzip大;压缩比不如xz;不支持目录压缩 比gzip好一点,但是又不如xz,处境比较尴尬
xz 2009年诞生的新贵,优点是压缩比显著优于zip、gzip、bzip2等前辈 压缩时间较长,不支持目录压缩 适用于对存储或带宽有严格要求的场景

gzip压缩工具

命令行格式: gzip [参数] [filename]

注:

  • gzip只能压缩文件,不能压缩目录;如果要压缩目录,可以加-r选项;

  • gzip默认压缩级别为6;

常用参数:

参数 解释
-n n代表压缩等级,从1到9,默认为6,可不加。
-d 表示解压缩
-c 指定目录

压缩文件

不带任何参数,直接压缩

1
2
3
4
5
6
7
8
9
10
11
12
//准备压缩文件
[root@stevey ~]# find /etc/ -type f -name '*conf' -exec cat {} >> b.txt \;
[root@stevey ~]# du -sh b.txt
704K b.txt

//压缩b.txt
[root@stevey ~]# gzip b.txt
[root@stevey ~]# ls
1.txt a.txt test test.tar.bz2 test.zip
anaconda-ks.cfg b.txt.gz test.tar test.tar.gz
[root@stevey ~]# du -sh b.txt.gz
616K b.txt.gz

解压缩

  • 方法一:gzip -d [filename]
1
2
3
4
5
6
[root@stevey ~]# gzip -d b.txt.gz
[root@stevey ~]# ls
1.txt a.txt test test.tar.bz2 test.zip
anaconda-ks.cfg b.txt test.tar test.tar.gz
[root@stevey ~]# wc -l b.txt
60410 b.txt
  • 方法二:gunzip [参数] [filename]
1
[root@stevey ~]# gunzip b.txt.gz

注意:

  • -r 参数需记忆,表示归递处理,将指定目录下的所有文件及子目录一并处理。

  • 平常参数可省略,直接使用gunzip [filename] 解压文件。

进阶:指定压缩/解压缩保存路径

默认采用gzip 压缩,压缩包会放在当前目录下,并删除原文件;使用-c参数可以指定压缩包路径,这样原文件就不会被删除了。

  • 指定压缩目录 gzip -c [filename] > [保存目录]
1
[root@stevey ~]# gzip -c b.txt > /tmp/test/b.txt.gz
  • 指定解压缩目录 gzip -d -c [压缩包名] > [指定解压缩文件路径]
1
[root@stevey ~]# gzip -c b.txt /tmp/test/b.txt.gz > /tmp/c.txt

注意:

  • 这里的解压路径是绝对路径;

  • 文件名支持重命名;

校验一下,这两个文件是一模一样的。

1
2
3
4
[root@stevey ~]# wc -l /tmp/test/b.txt
60410 /tmp/test/b.txt
[root@stevey ~]# wc -l b.txt
60410 b.txt

bzip2压缩工具

bzip2 安装:

centOS 7 默认没有,需要单独安装 yum install -y bzip2

bzip2 使用:

命令行格式:bzip2 [参数] [filename]

注:

  • bzip2 工具也是支持文件压缩,不支持目录压缩;

  • 默认压缩级别为9;

常用参数

参数 解释
-z 表示压缩,可省略
-d 表示解压缩

示例:

1
2
bzip2 1.txt   //压缩1.txt
bzip2 -d 1.txt //解压缩 1.txt.bz2

xz压缩工具

命令行格式: xz [参数] [filename]

注:bzip2 工具也是支持文件压缩,不支持目录压缩。

常见参数:

参数 解释
-z 表示压缩,可省略
-d 表示解压缩

示例:

1
2
xz 1.txt   //压缩1.txt
xz -d 1.txt //解压缩 1.txt.xz

zip 压缩工具

除了上述这些打包压缩工具,还需要考虑到在windows、linux、 mac下通用的打包压缩格式 .zip

zip压缩

zip 工具centos默认没有,需要单独安装 yum install -y zip

命令行格式:zip [参数] [压缩包名称] [源文件或目录]

如果目录下有还有二级甚至多级目录,zip命令 不加参数时,仅仅会讲二级目录压缩;

如果想一并压缩二级目录及多级目录,有两种方法:

  • 第一种方法:使用通配符
1
zip test.zip test/*
  • 第二种方法:使用 -r 参数
1
zip -r test.zip test/

unzip 解压缩

zip文件需要单独安装unzip 工具来解压,安装命令为 yum install -y unzip

命令行格式: unzip [filename]

文件打包工具 tar

由于gzip、bzip2、xz三个压缩工具都是针对文件进行压缩,对目录束手无策,因此一款打包工具呼之欲出,这就是tar

不仅如此,tar 强大之处在于,配合参数,可以打包压缩一起来。

命令行格式:tar [参数] [目标文件] [源文件或目录]

注:

  • 目标文件 指的是打包后的文件名

  • 源文件或目录 指的是需要打包的文件或目录

常用参数

参数 解释
-c 小写c,建立一个tar包或压缩包
-C 大写C,切换到指定目录
-v 表示可视化
-f 指定压缩文件包名称 (多个参数组合的情况下,把f放在最后,紧跟压缩文件包名)
-t 查看tar包里的内容
-z 指定gzip压缩
-j(小写) 指定bzip2压缩
-J(大写) 指定xz压缩
-x 解包或解压缩
–exclude filename 特殊用法,表示在打包或者压缩是,将该filename排除在外

常见用法:

tar命令的参数经常连用,示例如下:

文件目录打包

  • -cvf 可视化打包目录test,指定文件名为test.tar

  • -xvf 解包test.tar

  • 解包到指定目录 -C
1
2
3
4
5
6
7
[root@stevey ~]# tar -xvf test.tar -C /root/test2/
test/
test/test1/
test/test1/a.txt
test/test2/
test/test3/
test/b.txt
  • --exclude filename 特殊用法,将指定文建排除在外

当前目录的情况

打包压缩的情况

-tf 查看一下打包后的目录文件情况

注:--exclude 支持过滤多个文件,每个文件名都要用 --exclude 隔开。

文件打包并用gzip处理

  • -czvf 打包文件并使用gzip压缩

  • -zxvf 解压缩 .tar.gz 格式的文件

  • zcat 查看压缩包文件内容

注: zcat 用于不真正解压缩文件,就能显示压缩包中文件的内容的场景。

文件打包并用bzip2处理

-cjvf 打包文件并使用bzip2压缩

-xjvf 解压缩 .tar.bz2 格式的文件

  • bzcat 不解压包查看内容

文件打包并用xz处理

这里补充一点网上查到的资料:根据维基百科解释xz是一个使用 LZMA压缩算法的无损数据压缩文件格式。由于 xz 文件格式的压缩率更高,已在 Linux 各发行版中广泛使用。最典型的就是Linux内核,比如Linux内核3.12就是.xz后缀的文件,压缩包仅72.85MB,解压后能达到518.77MB。

-Jcvf 压缩文件 注:J为大写

1
tar -Jcvf linux-3.12

-Jxvf 解压缩文件 注:J为大写

1
tar -Jxvf linux-3.12.tar.xz

进阶:如何压缩/解压缩超过4G的文件

linux 的unzip命令处理4G以上的压缩包会报错,解决办法是换个压缩工具,使用7zip工具。

7zip 安装:

1
2
3
4
5
6
7
8
9
10
11
yum install -y wget  //先安装wget ,已经安装过的可以跳过这一步

wget https://jaist.dl.sourceforge.net/project/p7zip/p7zip/16.02/p7zip_16.02_src_all.tar.bz2 //下载安装包

tar -jxvf p7zip_16.02_src_all.tar.bz2 //解压安装包

cd p7zip_16.02 //进入安装目录

make

make install //也可以直接输入 make & make install

注意:这里遇到了两个坑

第一,错误提示:g++: Command not found,如下图所示。估计是缺某个依赖包,网上查了一下,固然如此

解决方案:

1
yum -y install gcc+ gcc-c++

第二,也是错误提示,就是上图中的这一句:make[1]:Leaving directory /root/p7zip_16.02/CPP/7zip/Bundles/Alone

网上查了半天,也没查出所以然,后来试着make install安装了一下,输入7zip 显示如下:

1
2
[root@stevey p7zip_16.02]# p7zip
-bash: p7zip: command not found

再后来,发现命令行输错了,正确的命令行格式是 7za [参数] [文件或目录名]

此外,网上很多教程都提到 安装如果发现乱码,请执行命令export LANG=zh_CN.GBK不过,我没有遇到这个问题。

7zip使用:

命令行格式:7za [参数] [文件或目录名]

常见用法:

1
2
3
4
5
7za a -t 7z -r [压缩包名] [压缩文件/目录]  //压缩命令,-t指定压缩类型,默认7z;-r指归递处理,表示递归所有的子文件夹

7za e [filename] //解压到当前目录下,不保留原来的目录结构

7za x [filename] //解压到当前目录下,但保留原来的目录结构

查看压缩文件

查看压缩文件类型:file [压缩包名]

1
2
[root@stevey ~]# file b.txt.gz  
b.txt.gz: gzip compressed data, was "b.txt", from Unix, last modified: Mon Apr 16 20:44:32 2018

查看压缩文件内容:

zcat命令用于不真正解压缩文件,就能显示压缩包中文件的内。

命令行格式:

1
zcat [参数] [压缩包名]
常用参数 含义
-S 指定gzip格式的压缩包的后缀。当后缀不是标准压缩包后缀时使用此选项;
-c 将文件内容写到标注输出;
-d 执行解压缩操作;
-l 显示压缩包中文件的列表;
-L 显示软件许可信息;
-q 禁用警告信息;
-r 在目录上执行递归操作;
-t 测试压缩文件的完整性;
-V 显示指令的版本信息;
-l 更快的压缩速度;

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@stevey ~]# zcat !$ |head   //这里涉及`!$`特殊用法,指的是上一条bash命令的最后一个值,也就是 `b.txt.gz`

zcat b.txt.gz |head
# Generated by NetworkManager
nameserver 129.29.29.29
# The upstream Mozilla.org project tests all changes to the root CA
# list with the NSS (Network Security Services) library.
#
# Occassionally, changes might cause compatibility issues with
# other cryptographic libraries, such as openssl or gnutls.
#
# The package maintainers of the CA certificates package might decide
# to temporarily keep certain (legacy) root CA certificates trusted,

参考资料

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!