前言
首先,我们先了解一下归档文件和压缩文件,如下:
归档文件:是将一些文件或目录,存储在一个文件中,其文件大小,等于其里面需要归档的各个文件和目录的总和。
压缩文件:是将一些文件或目录,压缩到一个文件中,其文件大小,远小于其里面需要压缩的各个文件和目录的总和,故占用更少的磁盘空间。
下面学习一下 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
;-n
:n
是指定压缩的速度,默认是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
或-force
:bzip2
在压缩或解压缩时,若输出文件与现有文件同名,预设不会覆盖现有文件。若要覆盖。请使用此参数;-h
:在线帮助;-k
:bzip2
在压缩或解压缩后,会删除原始文件。若要保留原始文件,请使用此参数;-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
zip
和 unzip
是 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<目录>
:指定文件解压缩后所要存储的目录;-Z
:unzip-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
评论区