Linux 笔记 - 第八章 文档的打包与压缩

时间:2021-09-26 23:47:50

博客地址:http://www.moonxy.com

一、前言

在 Linux 系统中,文件的后缀名没有实际的意义,加或者不加都无所谓。但是为了便于区分,我们习惯在定义文件名时加一个后缀名,比如常见的归档文件 .gz,归档压缩文件 .tar.gz 等,特别对于压缩文件,最好加上后缀名,这样方便判断压缩文件是由那种压缩工具所压缩,而后才能去正确地解压缩这个文件。打包和压缩虽然经常同时出现,但是两者却各不相同,打包是指将一大堆文件或目录什么的变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。

二、打包归档

tar 是一个打包工具,可以把目录或文件打包成一个文件,它将所有文件归档成一个大文件整体,方便复制或者移动。命令格式为:tar [-zjxcvfpP] filename 目录或文件,此命令选项前的"-"可以省略。tar 命令可以用来压缩打包单文件、多个文件、单个目录、多个目录,使用 tar 命令打包后原文件不会删除

-z:表示同时使用 gzip 压缩;
-j:表示同时使用 bzip2 压缩;
-J:表示同时使用 xz 压缩;
-x:表示解包或者解压缩;
-t:表示查看 tar 包里的文件;
-c:表示建立一个 tar 包或者压缩包;
-v:表示可视化,即显示打包的内容;
-f:表示后面需要跟文件名,即 "-f filename",表示归档后的文件名为 filename,或者解包文件名为 filename。如果使用了多个参数时,-f 参数一定要写到参数列表的最后;
-p:使用原文件的原来属性(属性不会依据使用者而变),恢复字段到它们的原始方式,忽略现有的用户权限屏蔽位(umask)。 加了 -p 之后,tar 进行解压后,生成的文件的权限,是直接取自 tar 包里面文件的权限(不会再使用该用户的 umask 值进行运算),那么不加 -p 参数,将还要再减去 umask 的值(位运算的减),但是如果使用 root 用户进行操作,加不加 -p 参数都一样;
-P:不剥离起始路径的“/”目录,可以使用绝对路径来压缩。一般情况下,待压缩的目录如果是一个绝对路径,压缩后会将根目录符号/去掉,这样,在解压时,得到的目录结构是以当前目录为基础目录的,如果在压缩时加上-P,则解压时还是以根目录为基础目录;
-r:向压缩归档文件末尾追加文件;
-u:更新原压缩包中的文件;
--exclude file:在打包或压缩的过程中,不要将 file 打包在内。
不管是打包还是解包,原来的文件是不会删除的,而且它会覆盖当前已经存在的文件或者目录。

打包:tar -cvf filename 文件或目录

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
[root@ryan linux]# tar -cvf test1.tar test1
test1/
test1/cp1.txt
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar

解包:tar -xvf filename

[root@ryan linux]# tar -tf test1.tar
test1/
test1/cp1.txt
[root@ryan linux]# rm -rf test1
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
-rw-r--r--. root root Mar : test1.tar
[root@ryan linux]# tar -xvf test1.tar
test1/
test1/cp1.txt
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar

三、压缩工具

Linux 中 compress 命令是一个相当古老的 Unix 档案压缩命令,压缩后的档案会加上一个 .Z 延伸档名以区别未压缩的档案,压缩后的档案可以以 uncompress 解压。若要将数个档案压成一个压缩档,必须先将档案 tar 起来再压缩。由于 gzip 可以产生更理想的压缩比例,所以现在通常改用 gzip 为档案压缩工具。

3.1 gzip 压缩工具

gzip 命令的格式为:gzip [-d#] filename,其中 # 为1-9的数字。gzip 后面跟文件名,压缩后原文件会删除,但是 gzip 不支持压缩目录

-d:该参数在解压缩时使用,gzip -d 后面跟压缩文件表示解压已经压缩的文件;
-#:表示压缩等级,1 为最差,9 为最好,6 为默认值。

压缩:gzip filename

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar
[root@ryan linux]# gzip test1
gzip: test1 is a directory -- ignored
[root@ryan linux]# gzip install.log
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log.gz
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar

解压文件:gzip -d filename

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log.gz
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar
[root@ryan linux]# gzip -d install.log.gz
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar

3.2 bzip2 压缩工具

bzip2 命令的格式为:bzip2 [-dz] filename,不能压缩目录,压缩后原文件会删除。-z 表示压缩,-d 表示解压缩。其实,压缩时,-z 选项可以省略。

压缩:bzip2 [-z] filename 文件

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.gz
[root@ryan linux]# bzip2 test1
bzip2: Input file test1 is a directory.
[root@ryan linux]# bzip2 file.log
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log.bz2
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.gz

解压缩:bzip2 -d filename

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log.bz2
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.gz
[root@ryan linux]# bzip2 -d file.log.bz2
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.gz

3.3 命令 bzcat

bzcat - decompresses files to stdout,查看压缩包文档内容,tar -tf filename 可以查看归档包或者压缩包的文件列表,对于 bzip2 压缩格式的文本文档,我们可以使用 bzcat 命令查看文档内容。bzcat filename

[root@ryan linux]# bzcat file.log.bz2
安装 libgcc-4.4.-.el6.x86_64
warning: libgcc-4.4.-.el6.x86_64: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
安装 setup-2.8.-.el6_4..noarch
安装 filesystem-2.4.-.el6.x86_64
安装 xml-common-0.6.-.el6.noarch

对应的,zcat 查看 gzip 压缩格式的文本文档内容;xzcat 查看 xz 压缩格式的文本文档内容;此外还有zless、bzless、zmore、bzmore、xzless、xzmore 等命令,其实都是 cat、less、more 的延伸命令,用于查看压缩文档的内容。

3.4 使用 zip 压缩

如果没有安装 zip 命令,首先需要安装:[root@ryan linux]# yum install -y zip,zip 既可以压缩文件也可以压缩目录,且压缩后原文件不删除。

-r 选项表示递归压缩下级目录和文件,如下:zip -r filename 目录或文件

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.bz2
-rw-r--r--. root root Mar : test1.tar.gz
-rw-r--r--. root root Mar : test1.zip
drwxr-xr-x. root root Mar : test4
[root@ryan linux]# zip -r test4.zip test4
adding: test4/ (stored %)
adding: test4/cp1.txt (stored %)
adding: test4/testfolder/ (stored %)
adding: test4/testfolder/cp2.txt (stored %)
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.bz2
-rw-r--r--. root root Mar : test1.tar.gz
-rw-r--r--. root root Mar : test1.zip
drwxr-xr-x. root root Mar : test4
-rw-r--r--. root root Mar : test4.zip

3.5 解压 zip

解压 zip 压缩包,需要使用 unzip,需要安装:[root@ryan linux]# yum install -y unzip,unzip 解压缩后,原压缩包文件不删除。unzip filename

例如:将压缩文件 text.zip 在指定目录 /tmp下解压缩,如果已有相同的文件存在,要求 unzip命令 不覆盖原先的文件。

unzip -n test.zip -d /tmp

-n:解压缩时不要覆盖原有的文件;

-d<目录>:指定文件解压缩后所要存储的目录;

-v:执行时显示详细的信息;

-o:不必先询问用户,unzip 执行后覆盖原有的文件;unzip -o test.zip -d tmp/

查看压缩文件目录,但不解压。unzip -v test.zip

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.bz2
-rw-r--r--. root root Mar : test1.tar.gz
-rw-r--r--. root root Mar : test1.zip
drwxr-xr-x. root root Mar : test4
-rw-r--r--. root root Mar : test4.zip
[root@ryan linux]# rm -rf test4
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.bz2
-rw-r--r--. root root Mar : test1.tar.gz
-rw-r--r--. root root Mar : test1.zip
-rw-r--r--. root root Mar : test4.zip
[root@ryan linux]# unzip test4.zip
Archive: test4.zip
creating: test4/
extracting: test4/cp1.txt
creating: test4/testfolder/
extracting: test4/testfolder/cp2.txt
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.bz2
-rw-r--r--. root root Mar : test1.tar.gz
-rw-r--r--. root root Mar : test1.zip
drwxr-xr-x. root root Mar : test4
-rw-r--r--. root root Mar : test4.zip
[root@ryan linux]# ls -lR test4
test4:
total
-rw-r--r--. root root Mar : cp1.txt
drwxr-xr-x. root root Mar : testfolder test4/testfolder:
total
-rw-r--r--. root root Mar : cp2.txt

3.6 xz 压缩工具

linux 默认自带 xz 压缩工具,不支持压缩目录,压缩格式为:xz -z filename,-z 可有可无,默认会删除原文件,-k 保留原文件;-0至-9调节压缩率。如果不设置,默认压缩等级是6。xz -d 待解压文件,等价于 unxz 命令;-k 保留原文件。

压缩:xz [-z] filename

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
drwxr-xr-x. root root Nov : test1
[root@ryan linux]# xz test1
xz: test1: Is a directory, skipping
[root@ryan linux]# xz file.log
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log.xz
drwxr-xr-x. root root Nov : test1

解压:xz -d filename

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log.xz
drwxr-xr-x. root root Nov : test1
[root@ryan linux]# xz -d file.log.xz
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
drwxr-xr-x. root root Nov : test1

四、打包的同时压缩

tar 命令在使用时可以直接压缩,它支持 gzip 压缩和 bzip2 压缩。

4.1 打包的同时使用 gzip 压缩

使用 -z 选项可以压缩成 gzip 格式的文件,原文件不会删除

打包并压缩:tar -czvf filename 文件或目录

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
[root@ryan linux]# tar -czvf test1.tar.gz test1
test1/
test1/cp1.txt
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.gz

解压:tar -zxvf filename

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.gz
[root@ryan linux]# rm -rf test1
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
-rw-r--r--. root root Mar : test1.tar.gz
[root@ryan linux]# tar -xzvf test1.tar.gz
test1/
test1/cp1.txt
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.gz

4.2 打包的同时使用 bzip2 压缩

使用 -j 选项可以压缩成 bzip2 格式的文件,原文件不会删除

打包并压缩:tar -cjvf filename 文件或目录

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.gz
[root@ryan linux]# tar -cjvf test1.tar.bz2 test1
test1/
test1/cp1.txt
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.bz2
-rw-r--r--. root root Mar : test1.tar.gz

解压:tar -jxvf filename

[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
-rw-r--r--. root root Mar : test1.tar.bz2
-rw-r--r--. root root Mar : test1.tar.gz
[root@ryan linux]# tar -xjvf test1.tar.bz2
test1/
test1/cp1.txt
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : file.log
-rw-r--r--. root root Mar : install.log
drwxr-xr-x+ root root Dec : test
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.bz2
-rw-r--r--. root root Mar : test1.tar.gz

4.3 打包的同时使用 xz 压缩

使用 -J 选项可以压缩成 xz 格式的文件,原文件不会删除。
如果当前版本linux的tar命令参数支持使用xz压缩,则可直接使用如下命令:tar -cJvf filename.tar.xz
同理,解压的时候,如果当前版本linux的tar命令参数支持使用xz解压,则可直接使用如下命令:tar -Jxv -f filename.tar.xz
否则就要分两步,先用 xz -d 解压,变成 tar 包之后,再用 tar -xvf 解包:
xz -d finename.tar.xz
tar -xvf finename.tar

打包并压缩:tar -cJvf filename 文件或目录

[root@ryan linux]# ls -l
total
drwxr-xr-x. root root Nov : test1
[root@ryan linux]# tar -cJvf test1.tar.xz test1
test1/
test1/cp1.txt
[root@ryan linux]# ls -l
total
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.xz

解压:tar -Jxvf filename

[root@ryan linux]# rm -rf test1
[root@ryan linux]# ls -l
total
-rw-r--r--. root root Mar : test1.tar.xz
[root@ryan linux]# tar -Jxvf test1.tar.xz
test1/
test1/cp1.txt
[root@ryan linux]# ls -l
total
drwxr-xr-x. root root Nov : test1
-rw-r--r--. root root Mar : test1.tar.xz