路漫漫其修远兮
吾将上下而求索

linux打包压缩:tar,gz,xz,zip命令

1. 压缩比:压缩前和压缩后的文件体积大小之比。压缩比越高,文件压缩后的体积越小

2. 压缩目的:用时间换空间,压缩体积小,但是需要大量的cpu使用来计算

3. 工具和文件的后缀:

        a. compress/unpress,  .z

        b. gzip/gunzip,  .gz

        c. bzip2/bunzip2,   .bz2

        d. xz/unxz,  .xz

        e. zip/unzip

        f. 归档工具:tar,cpio

4. gzip, gunzip, zcat – compress or expand files

示例:压缩解压

[root@bogon ~]#cp /var/log/messages-20170322 ./messages
[root@bogon ~]#ll -h
total 1.8M
-rw------- 1 root root 1.8M Apr 25 20:38 messages
[root@bogon ~]#gzip messages     #压缩文件,同时删除源文件,同时自动加后缀.gz,显示为红色
[root@bogon ~]#ll -h
total 244K
-rw------- 1 root root 242K Apr 25 20:38 messages.gz
[root@bogon ~]#gunzip messages.gz   #解压文件,同时删除压缩文件
[root@bogon ~]#ll -h
total 1.8M
-rw------- 1 root root 1.8M Apr 25 20:38 messages

命令:zcat messages.gz  自动找一个临时文件夹,解压,并把解压的文件展示出来

gzip 参数:

         i. -d –decompress –uncompress解压缩,相当于gunzip

        ii. -#:指定压缩比,默认为6,数字越大,压缩比越大,(1-9)

                1. gzip -9 messages

         iii. -c:压缩并保留原文件 

[root@localhost ~]#ll -h
total 240K
-rw------- 1 root root 239K Apr 25 20:38 messages.gz
[root@localhost ~]#gzip -d messages.gz     #解压后也会删除原文件
[root@localhost ~]#ll
total 1772
-rw------- 1 root root 1812332 Apr 25 20:38 messages

[root@localhost ~]#gzip -c messages > messages.gz    #将messages压缩并保留原文件
[root@localhost ~]#ll -h
total 2.0M
-rw------- 1 root root 1.8M Apr 25 20:38 messages
-rw-r--r-- 1 root root 242K Apr 25 21:56 messages.gz

[root@localhost ~]#gzip -c -9 messages > messages1.gz    #同时指定两个参数
[root@localhost ~]#ll -h
total 2.3M
-rw------- 1 root root 1.8M Apr 25 20:38 messages
-rw-r--r-- 1 root root 239K Apr 25 21:56 messages1.gz
-rw-r--r-- 1 root root 242K Apr 25 21:56 messages.gz

5. bzip2, bunzip2, bzcat – compress or expand files

b. bzip2 messages   压缩文件,同时删除源文件,同时自动加后缀.bz2,显示为红色

c. bunzip2 messages.bz2   解压文件,同时删除压缩文件

d. bzcat messages.bz2  自动找一个临时文件夹,解压,并把解压的文件展示出来

压缩解压示例:

[root@localhost ~]#bzip2 messages 
[root@localhost ~]#ll -h
total 88K
-rw------- 1 root root 87K Apr 25 20:38 messages.bz2
[root@localhost ~]#bunzip2 messages.bz2 
[root@localhost ~]#ll -h
total 1.8M
-rw------- 1 root root 1.8M Apr 25 20:38 messages

bzip2 参数:

        -d:解压缩,相当于bunzip2

                #bzip2 -d messages.bz2

        -#:指定压缩比,默认为6,数字越大,压缩比越大,(1-9)

                bzip2 -9 messages

        -k –keep:压缩并保留原文件 

                # bzip2 -k messages 

6. xz/unxz/xzcat –  xz [option]… file…

b. xz messages   压缩文件,同时删除源文件,同时自动加后缀.xz,显示为红色

c. unxz messages.xz   解压文件,同时删除压缩文件

d. xzcat messages.xz  自动找一个临时文件夹,解压,并把解压的文件展示出来

压缩解压示例

[root@localhost ~]#ll -h
total 1.8M
-rw------- 1 root root 1.8M Apr 25 20:38 messages
[root@localhost ~]#xz messages 
[root@localhost ~]#ll -h
total 60K
-rw------- 1 root root 57K Apr 25 20:38 messages.xz
[root@localhost ~]#unxz messages.xz 
[root@localhost ~]#ll -h
total 1.8M
-rw------- 1 root root 1.8M Apr 25 20:38 messages

xz参数:

        -d:解压缩,相当于unxz

        -#:指定压缩比,默认为6,数字越大,压缩比越大,(1-9)

                xz -9 messages

        -k:压缩并保留原文件 

                 # xz -k messages 

以上压缩命令不能压缩目录,要想压缩目录,先要归档操作,常用tar,cpio命令

7. tar:归档,不会删除源文件

命令格式: tar [option]… file…

参数:

        c:创建归档,不会删除源文件

                tar -cf /tmp/mylog.tar *.log   参数f必须在后面,将所有.log文件归档为mylog.tar

        -x:展开归档,-C, –directory=DIR

              change to directory DIR

                tar -xf /root/mylog.tar   展开归档

                tar -xf /root/mylog.tar -C /root/test    展开归档到某个文件夹

        -t:不展开归档查看归档文件列表

                tar -tf /root/mylog.tar  

        -z:gzip2  调用gzip来进行压缩解压

                -zcf:#tar -zcf /root/mylog.tar.gz /tmp/test   将test目录归档并压缩为mylog.tar.gz

                -zxf:#tar -zxf /root/mylog.tar.gz    将mylog.tar.gz解压,解压后的目录时原目录,即test目录

        -j:bzip2  调用bzip2来进行压缩解压

                -jcf:#tar -jcf /root/mylog.tar.bz2 /tmp/test   将test目录归档并压缩为mylog.tar.bz2

                -jxf:#tar -jxf /root/mylog.tar.bz2    将mylog.tar.bz2解压,解压后的目录时原目录,即test目录

        -J:xz  大写j  调用xz来进行压缩解压

                -Jcf:#tar -Jcf /root/mylog.tar.xz /tmp/test   将test目录归档并压缩为mylog.tar.xz

                如果这样打包后,在root目录下面解压,则会在root目录下生成tmp目录,tmp目录下面是test文件,为了避免这个问题,在当前目录下面创建压缩文件,即,后面的test文件使用相对路径

                        #cd /tmp

                        #tar -Jcf /root/hehe.tar.xz  test  这样生成的解压文件就是源文件,最好是打包时,进入要打包的文件目录,减少目录层级注意

                -Jxf:#tar -Jxf /root/mylog.tar.xz    将mylog.tar.xz解压,解压后的目录时原目录,即test目录

        使用tar压缩时排除某个目录或文件
                在/home/abc目录下有3个子目录:abc1、abc2、abc3、abc4,现在想把/home/abc目录下的abc1、abc2、abc3、打包成abc.tar.gz,不打包abc4。
                cd  /home
                tar  -zcvf  abc.tar.gz  –exclude=abc4  abc

        -h:默认是打包软链本身,加上-h表示打包软链指向的文件

        -p:保留文件的属性

[root@localhost /var/log]#tar cf /tmp/mylog.tar *.log
[root@localhost /var/log]#cd /tmp
[root@localhost /tmp]#ll -h
-rw-r--r--  1 root root 980K Apr 25 22:18 mylog.tar

[root@localhost /tmp]#mkdir /root/test
[root@localhost /tmp]#tar -xf ./mylog.tar -C /root/test    #将tar包解压到指定目录中
[root@localhost /tmp]#cd /root/test/
[root@localhost ~/test]#ls
anaconda.ifcfg.log    anaconda.yum.log  pm-powersave.log           vmware-vmsvc.log    Xorg.9.log
anaconda.log          boot.log          spice-vdagent.log          vmware-vmusr.log    yum.log
anaconda.program.log  dracut.log        vmware-install.log         wpa_supplicant.log
anaconda.storage.log  mysqld.log        vmware-tools-upgrader.log  Xorg.0.log

综合示例,打包压缩,解压

[root@localhost /var/log]#cp *.log /root/test/
[root@localhost /var/log]#cd /root
[root@localhost ~]#ls
test
[root@localhost ~]#tar Jcf /tmp/test.tar.xz test
[root@localhost ~]#cd /tmp
[root@localhost /tmp]#ll -h test.tar.xz 
-rw-r--r-- 1 root root 68K Apr 25 22:27 test.tar.xz
[root@localhost /tmp]#cd /root/
[root@localhost ~]#ls
test
[root@localhost ~]#rm -rf test/
[root@localhost ~]#cd /tmp

[root@localhost /tmp]#tar xf test.tar.xz -C /root
[root@localhost /tmp]#cd /root
[root@localhost ~]#ls
test
[root@localhost ~]#cd test/
[root@localhost ~/test]#ls
anaconda.ifcfg.log    anaconda.yum.log  pm-powersave.log           vmware-vmsvc.log    Xorg.9.log
anaconda.log          boot.log          spice-vdagent.log          vmware-vmusr.log    yum.log
anaconda.program.log  dracut.log        vmware-install.log         wpa_supplicant.log
anaconda.storage.log  mysqld.log        vmware-tools-upgrader.log  Xorg.0.log

当名字里面有:的时候,执行tar命令会出错,解决方法,在目录前面加./ 当前目录,如下:

[root@localhost /]#tar -Jcf c:d.tar.xz a.txt 
tar (child): Cannot connect to c: resolve failed
tar: Child returned status 128
tar: Error is not recoverable: exiting now

[root@localhost /]#tar -Jcf ./c:d.tar.xz a.txt 

测试压缩解压命令是否会对权限,属主属组,还有软链造成影响和破坏

[root@localhost ~]#useradd nginx
[root@localhost ~]#chown -R nginx ./test/    #设置文件的属主为nginx
[root@localhost ~]#ll
total 4
drwxr-xr-x 2 nginx root 4096 Apr 25 22:26 test

[root@localhost ~]#ls    #创建软链对应的目录和文件
test
[root@localhost ~]#mkdir file
[root@localhost ~]#ls
file  test
[root@localhost ~]#cd file/
[root@localhost ~/file]#ls
[root@localhost ~/file]#echo hello > a
[root@localhost ~/file]#echo hi >b
[root@localhost ~/file]#ls
a  b

[root@localhost ~]#cd test/
[root@localhost ~/test]#ls
anaconda.ifcfg.log  anaconda.log  anaconda.program.log  anaconda.storage.log  anaconda.yum.log
[root@localhost ~/test]#ln -sv ../file/ ./f
`./f' -> `../file/'
[root@localhost ~/test]#ll
total 388
-rw------- 1 nginx root   2368 Apr 25 22:26 anaconda.ifcfg.log
-rw------- 1 nginx root  22952 Apr 25 22:26 anaconda.log
-rw------- 1 nginx root  43193 Apr 25 22:26 anaconda.program.log
-rw------- 1 nginx root 173315 Apr 25 22:26 anaconda.storage.log
-rw------- 1 nginx root 144804 Apr 25 22:26 anaconda.yum.log
lrwxrwxrwx 1 root  root      8 Apr 25 23:01 f -> ../file/

[root@localhost ~]#tar zcf test.tar.gz test
[root@localhost ~]#ll
total 56
drwxr-xr-x 2 root  root  4096 Apr 25 23:00 file
drwxr-xr-x 2 nginx root  4096 Apr 25 23:01 test
-rw-r--r-- 1 root  root 46333 Apr 25 23:25 test.tar.gz
[root@localhost ~]#tar xf test.tar.gz -C /tmp
[root@localhost ~]#cd /tmp
[root@localhost /tmp]#ll
total 4
drwxr-xr-x 2 nginx root 4096 Apr 25 23:01 test
[root@localhost /tmp]#cd test/
[root@localhost /tmp/test]#ll
total 388
-rw------- 1 nginx root   2368 Apr 25 22:26 anaconda.ifcfg.log
-rw------- 1 nginx root  22952 Apr 25 22:26 anaconda.log
-rw------- 1 nginx root  43193 Apr 25 22:26 anaconda.program.log
-rw------- 1 nginx root 173315 Apr 25 22:26 anaconda.storage.log
-rw------- 1 nginx root 144804 Apr 25 22:26 anaconda.yum.log
lrwxrwxrwx 1 root  root      8 Apr 25 23:26 f -> ../file/

结论:这个命令压缩解压会保留文件的属主和权限信息,不会损坏,复制软链的时候复制的是软链的本身,而不是软链对应的文件

8. zip   zip/unzip   后缀名.zip

zip参数

        -q 不显示指令执行过程。 

        -r 递归处理,将指定目录下的所有文件和子目录一并处理。 

        -m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。

        -x<范本样式> 压缩时排除符合条件的文件。

                zip -r foo foo -x \*.o    #所有以.o结尾的文件都被排除了 

        -X 不保存额外的文件属性。 

        -y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。 

        -<压缩效率> 压缩效率是一个介于1-9的数值。

        -P password  Use password to encrypt zipfile entries

unzip参数

        -t 检查压缩文件是否正确

        -P<密码> 使用zip的密码选项

        -q 执行时不显示任何信息

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

说明,zip命令压缩默认是有压缩过程产生的

压缩解压示例,压缩目录要使用-r选项,解压到指定目录-d

[root@localhost ~]#ls
test
[root@localhost ~]#zip -r test.zip test/
  adding: test/ (stored 0%)
  adding: test/Xorg.0.log (deflated 89%)
  adding: test/anaconda.yum.log (deflated 87%)
  adding: test/mysqld.log (stored 0%)
  adding: test/anaconda.log (deflated 83%)
  adding: test/vmware-install.log (deflated 67%)
  adding: test/vmware-tools-upgrader.log (deflated 46%)
  adding: test/anaconda.program.log (deflated 83%)
  adding: test/anaconda.storage.log (deflated 91%)
  adding: test/yum.log (stored 0%)
  adding: test/Xorg.9.log (deflated 78%)
  adding: test/pm-powersave.log (deflated 15%)
  adding: test/vmware-vmsvc.log (deflated 92%)
  adding: test/boot.log (deflated 69%)
  adding: test/spice-vdagent.log (stored 0%)
  adding: test/dracut.log (deflated 93%)
  adding: test/wpa_supplicant.log (stored 0%)
  adding: test/anaconda.ifcfg.log (deflated 83%)
  adding: test/vmware-vmusr.log (deflated 94%)
[root@localhost ~]#ls
test  test.zip
[root@localhost ~]#unzip test.zip -d /tmp/test
Archive:  test.zip
   creating: /tmp/test/test/
  inflating: /tmp/test/test/Xorg.0.log  
  inflating: /tmp/test/test/anaconda.yum.log  
 extracting: /tmp/test/test/mysqld.log  
  inflating: /tmp/test/test/anaconda.log  
  inflating: /tmp/test/test/vmware-install.log  
  inflating: /tmp/test/test/vmware-tools-upgrader.log  
  inflating: /tmp/test/test/anaconda.program.log  
  inflating: /tmp/test/test/anaconda.storage.log  
 extracting: /tmp/test/test/yum.log  
  inflating: /tmp/test/test/Xorg.9.log  
  inflating: /tmp/test/test/pm-powersave.log  
  inflating: /tmp/test/test/vmware-vmsvc.log  
  inflating: /tmp/test/test/boot.log  
 extracting: /tmp/test/test/spice-vdagent.log  
  inflating: /tmp/test/test/dracut.log  
 extracting: /tmp/test/test/wpa_supplicant.log  
  inflating: /tmp/test/test/anaconda.ifcfg.log  
  inflating: /tmp/test/test/vmware-vmusr.log  
[root@localhost ~]#cd /tmp/test
[root@localhost /tmp/test]#ls
test
[root@localhost /tmp/test]#cd test/
[root@localhost /tmp/test/test]#ls
anaconda.ifcfg.log    anaconda.yum.log  pm-powersave.log           vmware-vmsvc.log    Xorg.9.log
anaconda.log          boot.log          spice-vdagent.log          vmware-vmusr.log    yum.log
anaconda.program.log  dracut.log        vmware-install.log         wpa_supplicant.log
anaconda.storage.log  mysqld.log        vmware-tools-upgrader.log  Xorg.0.log

静默压缩解压,不输出过程

[root@localhost ~]#zip -q -r test.zip test/
[root@localhost ~]#du -sh *
996K	test
100K	test.zip
[root@localhost ~]#rm -rf test
[root@localhost ~]#unzip -q test.zip -d /tmp
[root@localhost ~]#echo $?
0

压缩后删除原文件

[root@localhost ~]#ls
test
[root@localhost ~]#zip -r -m -q test.zip test
[root@localhost ~]#ll
total 100
-rw-r--r-- 1 root root 99351 Apr 25 22:52 test.zip

设置密码

[root@localhost ~]#ls
test
[root@localhost ~]#zip -r -q -P 2345 test.zip test
[root@localhost ~]#ll
total 104
drwxr-xr-x 2 root root  4096 Apr 25 22:26 test
-rw-r--r-- 1 root root 99855 Apr 25 22:54 test.zip
[root@localhost ~]#rm -rf test

[root@localhost ~]#unzip -q -P 2345 test.zip 
[root@localhost ~]#ls
test  test.zip

测试压缩解压命令是否会对权限,属主属组,还有软链造成影响和破坏

[root@localhost ~]#useradd nginx
[root@localhost ~]#chown -R nginx ./test/    #设置文件的属主为nginx
[root@localhost ~]#ll
total 4
drwxr-xr-x 2 nginx root 4096 Apr 25 22:26 test

[root@localhost ~]#ls    #创建软链对应的目录和文件
test
[root@localhost ~]#mkdir file
[root@localhost ~]#ls
file  test
[root@localhost ~]#cd file/
[root@localhost ~/file]#ls
[root@localhost ~/file]#echo hello > a
[root@localhost ~/file]#echo hi >b
[root@localhost ~/file]#ls
a  b

[root@localhost ~]#cd test/
[root@localhost ~/test]#ls
anaconda.ifcfg.log  anaconda.log  anaconda.program.log  anaconda.storage.log  anaconda.yum.log
[root@localhost ~/test]#ln -sv ../file/ ./f
`./f' -> `../file/'
[root@localhost ~/test]#ll
total 388
-rw------- 1 nginx root   2368 Apr 25 22:26 anaconda.ifcfg.log
-rw------- 1 nginx root  22952 Apr 25 22:26 anaconda.log
-rw------- 1 nginx root  43193 Apr 25 22:26 anaconda.program.log
-rw------- 1 nginx root 173315 Apr 25 22:26 anaconda.storage.log
-rw------- 1 nginx root 144804 Apr 25 22:26 anaconda.yum.log
lrwxrwxrwx 1 root  root      8 Apr 25 23:01 f -> ../file/

####开始
[root@localhost ~]#zip -r -q test.zip test
[root@localhost ~]#ls
file  test  test.zip

[root@localhost ~]#unzip -d /tmp -q test.zip     #解压到tmp目录下面
[root@localhost ~]#cd /tmp/
[root@localhost /tmp]#ll
total 4
drwxr-xr-x 3 root root 4096 Apr 25 23:01 test
[root@localhost /tmp]#cd test/
[root@localhost /tmp/test]#ll
total 392
-rw------- 1 root root   2368 Apr 25 22:26 anaconda.ifcfg.log
-rw------- 1 root root  22952 Apr 25 22:26 anaconda.log
-rw------- 1 root root  43193 Apr 25 22:26 anaconda.program.log
-rw------- 1 root root 173315 Apr 25 22:26 anaconda.storage.log
-rw------- 1 root root 144804 Apr 25 22:26 anaconda.yum.log
drwxr-xr-x 2 root root   4096 Apr 25 23:00 f
[root@localhost /tmp/test]#cd f/
[root@localhost /tmp/test/f]#ls
a  b

结论:会破坏原有的属主,并默认将软链对应的文件复制到为软链的目录下面

文件分割:split

如果文件比较大,需要将其分割成小文件,可以使用split命令,分割的速度非常快

-b 表示设置每个分割包的大小,单位:K,M,G,T
-d 参数指定生成的分割包后缀为数字的形式
-a x来设定序列的长度(默认值是2, 00,01...)

下面是示例:

tar -zcvf cm-11.tar.gz cm-11
split -b 4000M -d -a 1 cm-11.tar.gz cm-11.tar.gz.

其实以上两步也可以合并成一步来执行
tar -zcvf cm-11.tar.gz cm-11 | split -b 4000M -d -a 1 - cm-11.tar.gz.

执行命令后,生成压缩包如下:

-rw-r--r--  1 root     root      4194304000 May 20 14:00 cm-11.tar.gz.0
-rw-r--r--  1 root     root      4194304000 May 20 14:02 cm-11.tar.gz.1
-rw-r--r--  1 root     root      4194304000 May 20 14:03 cm-11.tar.gz.2
-rw-r--r--  1 root     root      4194304000 May 20 14:05 cm-11.tar.gz.3
-rw-r--r--  1 root     root      4194304000 May 20 14:06 cm-11.tar.gz.4
-rw-r--r--  1 root     root      4194304000 May 20 14:08 cm-11.tar.gz.5
-rw-r--r--  1 root     root      4194304000 May 20 14:09 cm-11.tar.gz.6
-rw-r--r--  1 root     root      2256379886 May 20 14:10 cm-11.tar.gz.7

分割后的压缩包解压命令如下:

cat cm-11.tar.gz.* | tar -zxv

未经允许不得转载:江哥架构师笔记 » linux打包压缩:tar,gz,xz,zip命令

分享到:更多 ()

评论 抢沙发

评论前必须登录!