一、前言
在 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 28 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 [root@ryan linux]# tar -cvf test1.tar test1 test1/ test1/cp1.txt [root@ryan linux]# ls -l total 40 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 10240 Mar 18 21:11 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 36 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test -rw-r--r--. 1 root root 10240 Mar 18 21:11 test1.tar [root@ryan linux]# tar -xvf test1.tar test1/ test1/cp1.txt [root@ryan linux]# ls -l total 40 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 10240 Mar 18 21:11 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 40 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 10240 Mar 18 21:11 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 28 -rw-r--r--. 1 root root 3825 Mar 18 17:48 install.log.gz drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 10240 Mar 18 21:11 test1.tar
解压文件:gzip -d filename
[root@ryan linux]# ls -l total 28 -rw-r--r--. 1 root root 3825 Mar 18 17:48 install.log.gz drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 10240 Mar 18 21:11 test1.tar [root@ryan linux]# gzip -d install.log.gz [root@ryan linux]# ls -l total 40 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 10240 Mar 18 21:11 test1.tar
3.2 bzip2 压缩工具
bzip2 命令的格式为:bzip2 [-dz] filename,不能压缩目录,压缩后原文件会删除。-z 表示压缩,-d 表示解压缩。其实,压缩时,-z 选项可以省略。
压缩:bzip2 [-z] filename 文件
[root@ryan linux]# ls -l total 48 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 161 Mar 18 22:02 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 36 -rw-r--r--. 1 root root 3385 Mar 20 20:46 file.log.bz2 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz
解压缩:bzip2 -d filename
[root@ryan linux]# ls -l total 36 -rw-r--r--. 1 root root 3385 Mar 20 20:46 file.log.bz2 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz [root@ryan linux]# bzip2 -d file.log.bz2 [root@ryan linux]# ls -l total 48 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 161 Mar 18 22:02 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.7-17.el6.x86_64 warning: libgcc-4.4.7-17.el6.x86_64: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY 安装 setup-2.8.14-20.el6_4.1.noarch 安装 filesystem-2.4.30-3.el6.x86_64 安装 xml-common-0.6.3-33.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 60 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 158 Mar 20 21:11 test1.tar.bz2 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz -rw-r--r--. 1 root root 162 Mar 20 21:21 test1.zip drwxr-xr-x. 3 root root 4096 Mar 20 21:24 test4 [root@ryan linux]# zip -r test4.zip test4 adding: test4/ (stored 0%) adding: test4/cp1.txt (stored 0%) adding: test4/testfolder/ (stored 0%) adding: test4/testfolder/cp2.txt (stored 0%) [root@ryan linux]# ls -l total 64 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 158 Mar 20 21:11 test1.tar.bz2 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz -rw-r--r--. 1 root root 162 Mar 20 21:21 test1.zip drwxr-xr-x. 3 root root 4096 Mar 20 21:24 test4 -rw-r--r--. 1 root root 678 Mar 20 21:31 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 64 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 158 Mar 20 21:11 test1.tar.bz2 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz -rw-r--r--. 1 root root 162 Mar 20 21:21 test1.zip drwxr-xr-x. 3 root root 4096 Mar 20 21:24 test4 -rw-r--r--. 1 root root 678 Mar 20 21:31 test4.zip [root@ryan linux]# rm -rf test4 [root@ryan linux]# ls -l total 60 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 158 Mar 20 21:11 test1.tar.bz2 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz -rw-r--r--. 1 root root 162 Mar 20 21:21 test1.zip -rw-r--r--. 1 root root 678 Mar 20 21:31 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 64 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 158 Mar 20 21:11 test1.tar.bz2 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz -rw-r--r--. 1 root root 162 Mar 20 21:21 test1.zip drwxr-xr-x. 3 root root 4096 Mar 20 21:24 test4 -rw-r--r--. 1 root root 678 Mar 20 21:31 test4.zip [root@ryan linux]# ls -lR test4 test4: total 8 -rw-r--r--. 1 root root 12 Mar 20 21:23 cp1.txt drwxr-xr-x. 2 root root 4096 Mar 20 21:24 testfolder test4/testfolder: total 4 -rw-r--r--. 1 root root 12 Mar 20 21:24 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 64 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 [root@ryan linux]# xz test1 xz: test1: Is a directory, skipping [root@ryan linux]# xz file.log [root@ryan linux]# ls -l total 52 -rw-r--r--. 1 root root 3616 Mar 20 20:46 file.log.xz drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1
解压:xz -d filename
[root@ryan linux]# ls -l total 52 -rw-r--r--. 1 root root 3616 Mar 20 20:46 file.log.xz drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 [root@ryan linux]# xz -d file.log.xz [root@ryan linux]# ls -l total 64 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1
四、打包的同时压缩
tar 命令在使用时可以直接压缩,它支持 gzip 压缩和 bzip2 压缩。
4.1 打包的同时使用 gzip 压缩
使用 -z 选项可以压缩成 gzip 格式的文件,原文件不会删除:
打包并压缩:tar -czvf filename 文件或目录
[root@ryan linux]# ls -l total 28 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 [root@ryan linux]# tar -czvf test1.tar.gz test1 test1/ test1/cp1.txt [root@ryan linux]# ls -l total 32 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz
解压:tar -zxvf filename
[root@ryan linux]# ls -l total 32 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz [root@ryan linux]# rm -rf test1 [root@ryan linux]# ls -l total 28 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz [root@ryan linux]# tar -xzvf test1.tar.gz test1/ test1/cp1.txt [root@ryan linux]# ls -l total 32 -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz
4.2 打包的同时使用 bzip2 压缩
使用 -j 选项可以压缩成 bzip2 格式的文件,原文件不会删除:
打包并压缩:tar -cjvf filename 文件或目录
[root@ryan linux]# ls -l total 48 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz [root@ryan linux]# tar -cjvf test1.tar.bz2 test1 test1/ test1/cp1.txt [root@ryan linux]# ls -l total 52 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 158 Mar 20 21:11 test1.tar.bz2 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz
解压:tar -jxvf filename
[root@ryan linux]# ls -l total 48 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test -rw-r--r--. 1 root root 158 Mar 20 21:11 test1.tar.bz2 -rw-r--r--. 1 root root 161 Mar 18 22:02 test1.tar.gz [root@ryan linux]# tar -xjvf test1.tar.bz2 test1/ test1/cp1.txt [root@ryan linux]# ls -l total 52 -rw-r--r--. 1 root root 13368 Mar 20 20:46 file.log -rw-r--r--. 1 root root 13368 Mar 18 17:48 install.log drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 158 Mar 20 21:11 test1.tar.bz2 -rw-r--r--. 1 root root 161 Mar 18 22:02 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 64 drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 [root@ryan linux]# tar -cJvf test1.tar.xz test1 test1/ test1/cp1.txt [root@ryan linux]# ls -l total 68 drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 208 Mar 21 22:24 test1.tar.xz
解压:tar -Jxvf filename
[root@ryan linux]# rm -rf test1 [root@ryan linux]# ls -l total 64 -rw-r--r--. 1 root root 208 Mar 21 22:24 test1.tar.xz [root@ryan linux]# tar -Jxvf test1.tar.xz test1/ test1/cp1.txt [root@ryan linux]# ls -l total 68 drwxr-xr-x. 2 root root 4096 Nov 26 03:46 test1 -rw-r--r--. 1 root root 208 Mar 21 22:24 test1.tar.xz