侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux基础(39)之压缩、解压缩及归档工具

zze
zze
2019-10-23 / 0 评论 / 0 点赞 / 622 阅读 / 12430 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

前言

首先,我们先了解一下归档文件和压缩文件,如下:
归档文件:是将一些文件或目录,存储在一个文件中,其文件大小,等于其里面需要归档的各个文件和目录的总和。
压缩文件:是将一些文件或目录,压缩到一个文件中,其文件大小,远小于其里面需要压缩的各个文件和目录的总和,故占用更少的磁盘空间。
下面学习一下 Linux 上常见的压缩、解压缩及归档工具。

常见的压缩、解压缩及归档工具

compress/uncompress

compress 命令使用“Lempress-Ziv”编码压缩数据文件。compress 是个历史悠久的压缩程序,文件经它压缩后,其名称后面会多出 .Z 的扩展名。当要解压缩时,可执行 uncompress 指令。事实上 uncompress 是指向 compress 的符号连接,因此不论是压缩或解压缩,都可通过 compress 指令单独完成,该命令仅能对单个文件进行压缩。
uncompress 命令用来解压缩由 compress 命令压缩后产生的.Z 压缩包。
安装:

yum install ncompress

使用格式:

compress [options...] [file]
uncompress [options] [file]

compress 命令

常用选项:

  • -f:不提示用户,强制覆盖掉目标文件;
  • -c:将结果送到标准输出,无文件被改变;
  • -r:递归的操作方式;
  • -b <压缩效率>:压缩效率是一个介于 9~16 的数值,预设值为 16,指定愈大的数值,压缩效率就愈高;
  • -d:对文件进行解压缩而非压缩;
  • -v:显示指令执行过程;
  • -V:显示指令版本及程序预设值;

示例:
passwd 压缩成另外一个文件:

[root@localhost tmp]# compress -c passwd > passwd.bak.Z
[root@localhost tmp]# ll
总用量 8
-rw-r--r--. 1 root root 909 10月 23 10:39 passwd
-rw-r--r--. 1 root root 544 10月 23 10:42 passwd.bak.Z

这个 -c 的选项比较有趣!会将压缩文件内容放到标准输出中,而不是直接写入文件。所以,我们可以使用输出重定向输出成为另一个档名的文件。

解压刚刚压缩的文件:

[root@localhost tmp]# compress -d passwd.bak.Z 
[root@localhost tmp]# ll
总用量 8
-rw-r--r--. 1 root root 909 10月 23 10:39 passwd
-rw-r--r--. 1 root root 909 10月 23 11:18 passwd.bak

uncompress 命令

常用选项:

  • -f:不提示用户,强制覆盖掉目标文件;
  • -c:将结果送到标准输出,无文件被改变;
  • -r:递归的操作方式。

它就相当于使用 compress -d ,这里就不做演示。

gzip/gunzip/zcat

gzip 是 linux 自带的压缩文件命令,它的压缩比大概能达到 60%-70%,比 zip 的压缩比更高。使用 gzip 压缩默认会在文件后加上 .gz 后缀并将源文件删除,该命令仅能对单个文件进行压缩。
gunzip 是解压缩命令。
zcat 命令可以直接查看使用 gzip 压缩后的文件的内容。
使用格式:

gzip [options...] [file]
gunzip [options...] [file]

常用选项:

  • -d--decompress 的简写,解压 gzip 压缩的文件;
  • -f--force 的简写,强行压缩文件,不理会文件名称或硬连接是否存在以及该文件是否为符号连接;
  • -l--list 的简写,列出压缩文件的相关信息;
  • -n--no-name 的简写,压缩文件时,不保存原来的文件名称及时间戳记;
  • -N--name 的简写,压缩文件时,保存原来的文件名称及时间戳记;
  • -r--recursive 的简写,递归处理,将指定目录下的所有文件及子目录一并处理;
  • -t--test 的简写,测试压缩文件是否正确无误;
  • --fast:指定以最快的速度压缩,即以低压缩比压缩,等同于 -1
  • --best:指定以最慢的速度压缩,即以高压缩比压缩,等同于-9
  • -nn 是指定压缩的速度,默认是 6
  • -c--stdou--to-stdout 的简写,把解压后的文件输出到标准设备,因为 gzip 压缩文件的时候,不会保留原文件,可以通过 -c 参数来保留原文件,如:gzip -c user.text > user.text.gz,如果是解压保留原文件,可以:gunzip -c user.text.gz > user.text

示例:
passwd 压缩成另外一个文件:

[root@localhost tmp]# gzip -c passwd > passwd.bak.gz
[root@localhost tmp]# ll
总用量 8
-rw-r--r--. 1 root root 909 10月 23 10:39 passwd
-rw-r--r--. 1 root root 410 10月 23 11:21 passwd.bak.gz

解压刚刚压缩的文件:

[root@localhost tmp]# gunzip passwd.bak.gz 
[root@localhost tmp]# ll
总用量 8
-rw-r--r--. 1 root root 909 10月 23 10:39 passwd
-rw-r--r--. 1 root root 909 10月 23 11:21 passwd.bak

bzip2/bunzip2/bzcat

bzip2 命令用于创建和管理(包括解压缩).bz2 格式的压缩包,该命令仅能对单个文件进行压缩。
bzcat 命令可以直接查看使用 bzip2 压缩后的文件的内容。
安装:

yum install bzip2

使用格式:

bzip2 [options...] [file]
bunzip2 [options...] [file]

常用选项:

  • -c:将压缩与解压缩的结果送到标准输出;
  • -d:执行解压缩;
  • -f-forcebzip2 在压缩或解压缩时,若输出文件与现有文件同名,预设不会覆盖现有文件。若要覆盖。请使用此参数;
  • -h:在线帮助;
  • -kbzip2 在压缩或解压缩后,会删除原始文件。若要保留原始文件,请使用此参数;
  • -s:降低程序执行时内存的使用量;
  • -t:测试 .bz2 压缩文件的完整性;
  • -v:压缩或解压缩文件时,显示详细的信息;
  • -z:强制执行压缩;
  • -V:显示版本信息;
  • --repetitive-best:若文件中有重复出现的资料时,可利用此参数提高压缩效果;
  • --repetitive-fast:若文件中有重复出现的资料时,可利用此参数加快执行效果;

示例:
passwd 压缩成另外一个文件:

[root@localhost tmp]# bzip2 -c passwd > passwd.bz2
[root@localhost tmp]# ll
总用量 8
-rw-r--r--. 1 root root 909 10月 23 10:39 passwd
-rw-r--r--. 1 root root 432 10月 23 11:30 passwd.bz2

解压刚刚压缩的文件:

[root@localhost tmp]# bunzip passwd.bz2
[root@localhost tmp]# ll
总用量 8
-rw-r--r--. 1 root root 909 10月 23 10:39 passwd
-rw-r--r--. 1 root root 909 10月 23 11:21 passwd.bak

xz/unxz/xzcat

xz 是一种压缩文件格式,采用 LZMA SDK 压缩,目标文件较 gzip 压缩文件(.gz·tgz)小 30%,较 .bz2 小 15%,该命令仅能对单个文件进行压缩。
使用格式:

xz [options...] [file]
unxz [options...] [file]
xzcat [options] [xz_file]
    xz_file:使用 xz 命令压缩的文件;

常用选项:

  • -d:解压缩;
  • -#:指定压缩比,默认是 6,数字越大压缩比越大(1-9);
  • -k:保留原文件;

示例:
passwd 压缩成另外一个文件:

[root@localhost tmp]# xz -c passwd > passwd.bak.xz
[root@localhost tmp]# ll
总用量 8
-rw-r--r--. 1 root root 909 10月 23 10:39 passwd
-rw-r--r--. 1 root root 468 10月 23 11:40 passwd.bak.xz

xzcat 可以在不解压的状态下查看压缩后的文件:

[root@localhost tmp]# xzcat passwd.bak.xz 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...

解压刚刚压缩的文件:

[root@localhost tmp]# unxz passwd.bak.xz
[root@localhost tmp]# ll
总用量 8
-rw-r--r--. 1 root root 909 10月 23 10:39 passwd
-rw-r--r--. 1 root root 909 10月 23 11:41 passwd.bak

zip/unzip/zipinfo

zipunzip是 linux 中压缩、解压工具,另外,它还支持归档操作。
zip 命令,可以将一个或多个文件或是目录,压缩成 .zip 格式的压缩文件;
unzip 命令,可以将 zip 压缩的文件解压到指定的目录。
zipinfo 命令可以在不解压压缩包的情况下查看压缩包内的文件内容。
安装:

yum -y install zip
yum -y install unzip

使用格式:

zip [options] <new_file> <dest_file|dest_dir>
    new_file:生成的压缩文件名称,文件名后会自动补上 .zip 后缀;
    dest_file|dest_dir:要压缩的文件或目录;
unzip [options] [dest_file]
    dest_file:要解压的 zip 包;
zipinfo [dest_file]
    dest_file:要查看内容的 zip 包

zip 命令

常用选项:

  • -d:从压缩文件内删除指定的文件;
  • -D:压缩文件内不建立目录名称;
  • -g:将文件压缩后附加在已有的压缩文件之后,而非另行建立新的压缩文件;
  • -m:将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中;
  • -q:不显示指令执行过程;
  • -r:递归处理,将指定目录下的所有文件和子目录一并处理;
  • -S:包含系统和隐藏文件;
  • -t<日期时间>:把压缩文件的日期设成指定的日期;;
  • -v:显示指令执行过程或显示版本信息;
  • -z:替压缩文件加上注释;
  • -<压缩效率>:压缩效率是一个介于1~9的数值;

示例:
创建 /etc 目录及其下所有文件的压缩文件:

[root@localhost tmp]# zip etc /etc -rq
[root@localhost tmp]# ls -lh
总用量 13M
-rw-r--r--. 1 root root 13M 10月 23 12:35 etc.zip

不解压的状态下删除压缩包中的 adhtime 文件:

[root@localhost tmp]# zip etc.zip -d /etc/adjtime 
deleting: etc/adjtime

创建文件 test.txt,并将其加到压缩包中,并使用 zipinfo 命令查看:

[root@localhost tmp]# touch test.txt
[root@localhost tmp]# zip etc.zip -g test.txt 
  adding: test.txt (stored 0%)
[root@localhost tmp]# zipinfo etc.zip | grep test.txt
-rw-r--r--  3.0 unx        0 bx stor 19-Oct-23 04:47 test.txt

unzip 命令

常用选项:

  • -l:显示压缩文件内所包含的文件;
  • -t:检查压缩文件是否正确;
  • -v:查看压缩包内的内容,类似 zipinfo 命令的作用;
  • -z:仅显示压缩文件的备注文字;
  • -n:解压缩时不要覆盖原有的文件;
  • -o:不必先询问用户,unzip执行后覆盖原有的文件;
  • -d<目录>:指定文件解压缩后所要存储的目录;
  • -Zunzip-Z 等于执行zipinfo 指令;

示例:
etc.zip 中提取出后缀为 .sh 的文件到 /tmp/testsh 目录:

[root@localhost tmp]# unzip etc.zip *.sh -d /tmp/testsh

解压上面创建的 etc.zip 文件:

[root@localhost tmp]# unzip -q etc.zip 

tar

tar 命令是 linux 常用的打包(归档)工具,即利用 tar 命令,可以把一大堆的文件和目录全部打包成一个文件。也可以在打包文件中改变文件,或者向打包文件中加入新的文件。
当然,tar 命令也可以解包。
首先要弄清两个概念:打包(归档)和压缩。
打包是指将一堆文件或目录变成一个总的文件;
压缩是将一个大的文件通过一些压缩算法变成一个小文件。
为什么要区分这两个概念呢?这源于 Linux 中很多压缩命令只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包,然后再用压缩程序进行压缩。
使用格式:

tar [options...] <new_file> [dest_files...]
    new_file:创建的压缩文件名称;
    dest_files:要归档的文件列表;

常用选项:

  • -A:新增归档文件到已经存在的归档中;
  • -B:设置区块大小;
  • -C:指定一个目录,如解压时指定则表示解压后的文件放到该目录;
  • -c:建立新的压缩文件,即打包;
  • -d:记录文件的差别;
  • -r:添加文件到已经存在的归档中;
  • -x:从压缩文件中提取文件,即解包;
  • -f:指定要打包的文件;
  • -t:显示归档文件的内容;
  • -z:打包后使用 gzip 进行压缩;
  • -j:打包后使用 bzip2 进行压缩;
  • -J:打包后使用 xz 进行压缩;
  • -v:显示操作过程;
  • -k:保留原有文件不覆盖;

示例:
打包文件且不压缩:

[root@localhost test]# tar -cf test.tar my.cnf passwd 
[root@localhost test]# ls -lh
总用量 20K
-rw-r--r--. 1 root root 570 10月 23 14:24 my.cnf
-rw-r--r--. 1 root root 909 10月 23 14:25 passwd
-rw-r--r--. 1 root root 10K 10月 23 14:25 test.tar

-f 参数后面,跟的是归档的文件名。
习惯上,大家都用 .tar 来作为辨识。 如果加 -z 选项,则以 .tar.gz.tgz 来代表使用 gzip 压缩过的 tar 包;如果加 -j 选项,则以 .tar.bz2 来作为 tar 包名。

打包文件且压缩:

[root@localhost test]# tar -zcf test.tar.gz my.cnf passwd
[root@localhost test]# ls -lh
总用量 12K
-rw-r--r--. 1 root root 570 10月 23 14:24 my.cnf
-rw-r--r--. 1 root root 909 10月 23 14:25 passwd
-rw-r--r--. 1 root root 852 10月 23 14:26 test.tar.gz

可以看出来,打包并压缩后的文件,比不压缩小了不少。
如果要使用 bzip2 压缩,将 -z 选项换成 -j 选项即可。

如果要查看打包文件中有哪些文件,有两种情况。
针对没有压缩过的文件,如 test.tar,直接执行如下命令即可:

tar -tvf test.tar

如果归档被 gzip 压缩过,如 test.tar.gz,需要带上选项 -z,如下:

tar -ztvf test.tar.gz

如果归档被 bzip2 压缩过,需要带上参数 -j,如下:

tar -jtvf test.tar.bz2

将 tar 文件解包时,如果 tar 文件没有被压缩,如 test.tar,直接执行如下命令:

tar -xvf test.tar

如果归档被 gzip 压缩过,如 test.tar.gz,需要带上参数 -z,如下:

tar -zxvf test.tar.gz

如果归档被 bzip2 压缩过,如 test.tar.bz2,需要带上参数 -j,如下:

tar -jxvf test.tar.bz2
0

评论区