zoukankan      html  css  js  c++  java
  • 压缩解压打包工具基础

     目录

       前言

       compress压缩解压工具

    gzip压缩解压工具

    bzip2压缩解压工具

    xz压缩解压工具

    zip压缩打包工具

    tar打包工具

    split文件分割

    cpio打包压缩

     

    前言

    无论是我们的个人笔记本台式机还是服务器,它们的存储设备可以存储的东西都是有限的,不可能无限的存储东西,除非我们不停地增加硬盘的数量,但是这又是非常不现实的,因为我们需要无限的空间,很多时候我们需要存储大量的不可删除的数据时,就会采用压缩的方式,这样我们就可以即剩下了很多空间同时又保存了我们的文件。

    在我们的常用的Windows操作系统上,压缩工具对文件的压缩效果并不是很出色,但是在在linux上文件的压缩率可以达到上千倍。接下来,让我们看看压缩工具都有那些,以及他们的压缩效果吧!

    compress压缩解压工具

    文件后缀名:.Z

    参数:

    -d 解压缩

          uncompress

          zcat X.Z > X

       -c 将结果打印到屏幕上,配合重定向,不会覆盖原文件,但权限会变。

    -f 默认不对硬链接数为2及以上的文件压缩,加上f,强制压缩指定文件,而其他同inode的文件硬链接数减1.

       -v 显示详细过程。

    [root@CT71 app]#ll -h
    total 31M
    -rw-r--r--. 1 root root 31M Aug 10 15:39 etc.tar
    [root@CT71 app]#compress etc.tar
    [root@CT71 app]#ll -h
    total 16M
    -rw-r--r--. 1 root root 16M Aug 10 15:39 etc.tar.Z

    由上面我们可以很容易知道compress这个压缩工具压缩率不是特别高,并且压缩后源文件是不会在存在的,如何保证源文件存在同时对文件进行压缩呢?

    [root@CT71 app]#compress -c etc.tar > etc.tar.Z
    [root@CT71 app]#ll
    total 47572
    -rw-r--r--. 1 root root 32286720 Aug 10 15:39 etc.tar
    -rw-r--r--. 1 root root 16422423 Aug 10 16:27 etc.tar.Z

    对于如何解压的问题,上述给出了三种方法,我在这里一一演示:

    [root@CT71 app]#compress -d etc.tar.Z
    [root@CT71 app]#uncompress etc.tar.Z
    [root@CT71 app]#zcat etc.tar.Z > etc.tar

    我们此时想,万一我们要压缩的文件是有超链接的话,咋办,我们只需要加上-f选项,就能将我们要压缩的文件从超链接中断掉:

    [root@CT71 app]#ll
    total 0
    -rw-r--r--. 1 root root 0 Aug 10 16:33 etc.tar
    [root@CT71 app]#ln etc.tar etc.tar.ln
    [root@CT71 app]#ll
    total 0
    -rw-r--r--. 2 root root 0 Aug 10 16:33 etc.tar  ------------------注意连接数
    -rw-r--r--. 2 root root 0 Aug 10 16:33 etc.tar.ln
    [root@CT71 app]#compress etc.tar
    etc.tar has 1 other links: unchanged
    [root@CT71 app]#compress -f etc.tar
    [root@CT71 app]#ll
    total 4
    -rw-r--r--. 1 root root 0 Aug 10 16:33 etc.tar.ln ------------------注意连接数
    -rw-r--r--. 1 root root 3 Aug 10 16:33 etc.tar.Z

    还有一个-v选项,它的作用就是在我们压缩的过程中显示一个进度,让我们可以了解到我们的压缩进度,对大文件压缩的时候作用比较明显,关于-f与-v选项,在下面我们就不在过多介绍

    gzip压缩解压工具

    文件后缀名:.gz

    参数:

    -d 解压缩

          gunzip

          zcat X.gz > X

       -c 将结果打印到屏幕上,配合重定向,不会覆盖原文件,但权限会变。

    -f 默认不对硬链接数为2及以上的文件压缩,加上f,强制压缩指定文件,而其他同inode的文件硬链接数减1.

       -v 显示详细过程。

       -# 数字越大,压缩比越高,速度越慢,文件越小。

          -1 等于 --fast

          -23456(default)78

          -9 等于 --best 

    [root@CT71 app]#ll -h
    total 227M
    -rw-------. 1 root root 7.6M Aug 10 16:43 messages
    -rw-r--r--. 1 root root 219M Aug 10 16:45 test_gzip
    [root@CT71 app]#gzip test_gzip
    [root@CT71 app]#ll -h
    total 11M
    -rw-------. 1 root root 7.6M Aug 10 16:43 messages
    -rw-r--r--. 1 root root 2.8M Aug 10 16:45 test_gzip.gz

    我们可以看到在默认压缩率的情况下,压缩比已经很高了,如果是9的话,会有多高的压缩率呢?

    [root@CT71 app]#gzip -v -9 test_gzip
    test_gzip:     98.8% -- replaced with test_gzip.gz
    [root@CT71 app]#ll -h
    total 11M
    -rw-------. 1 root root 7.6M Aug 10 16:43 messages
    -rw-r--r--. 1 root root 2.6M Aug 10 16:45 test_gzip.gz

    相比默认的压缩率,是比以前小点了。gzip的解压方式也是三种,同时它对文件压缩时,是不会保留原文件的;

    [root@CT71 app]#gzip -d test_gzip.gz 
    [root@CT71 app]#gunzip test_gzip.gz 
    [root@CT71 app]#zcat test_gzip.gz > test_gzip

    bzip2压缩解压工具

    文件后缀名:.bz2

    参数:

    -d 解压缩

          bunzip

          bzcat X.bz2 > X

       -k 保留原文件

       -c 将结果打印到屏幕上,配合重定向,不会覆盖原文件,但权限会变。

    -f 默认不对硬链接数为2及以上的文件压缩,加上f,强制压缩指定文件,而其他同inode的文件硬链接数减1.

       -v 显示详细过程。

       -# 数字越大,压缩比越高,速度越慢,文件越小。

          -1 等于 --fast

          -2345678

          -9 等于 --best (default)

    这个压缩工具相比前两个压缩率不仅有了提高,更重要的是可以保存源文件,并且不改变权限 

    [root@CT71 app]#ll -h
    total 91M
    -rw-------. 1 root root 7.6M Aug 10 16:43 messages
    -rw-r--r--. 1 root root  83M Aug 10 17:07 test_gzip
    [root@CT71 app]#bzip2 -k test_gzip 
    [root@CT71 app]#ll -h
    total 91M
    -rw-------. 1 root root 7.6M Aug 10 16:43 messages
    -rw-r--r--. 1 root root  83M Aug 10 17:07 test_gzip
    -rw-r--r--. 1 root root 472K Aug 10 17:07 test_gzip.bz2

    同样的我们说一下它的三种解压方式

    [root@CT71 app]#bzip2 -d test_gzip.bz2 
    [root@CT71 app]#bunzip2 test_gzip.bz2 
    [root@CT71 app]#bzcat test_gzip.bz2 > test

    xz压缩解压工具

    文件后缀名:.xz

    参数:

    -d 解压缩

          xzcat

       -k 保留原文件

    -f 默认不对硬链接数为2及以上的文件压缩,加上f,强制压缩指定文件,而其他同inode的文件硬链接数减1.

       -v 显示详细过程。

       -# 数字越大,压缩比越高,速度越慢,文件越小。

          -0 等于 --fast

          -1 -23456(default)78

          -9 等于 --best 

    相对于上面的压缩工具,这个压缩工具是压缩率最高的,高的吓人,用起来也是相当不错的。

    [root@CT71 app]#ll -h
    total 91M
    -rw-------. 1 root root 7.6M Aug 10 16:43 messages
    -rw-r--r--. 1 root root  83M Aug 10 17:07 test_xz
    [root@CT71 app]#xz -kv test_xz 
    test_xz (1/1)
      100 %         41.0 KiB / 82.7 MiB = 0.000    23 MiB/s       0:03             
    [root@CT71 app]#ll -h
    total 91M
    -rw-------. 1 root root 7.6M Aug 10 16:43 messages
    -rw-r--r--. 1 root root  83M Aug 10 17:07 test_xz
    -rw-r--r--. 1 root root  41K Aug 10 17:07 test_xz.xz

    解压方式也是大同小异:

    [root@CT71 app]#xz -d test_xz.xz 
    [root@CT71 app]#xzcat test_xz.xz > test.xz

    zip压缩打包工具

    文件后缀名:.zip

    打包压缩
        zip –r /testdir/sysconfig /etc/sysconfig/

       unzip

       |zip 将生成的文件名 -

       可以将管道前的输出结果转为文件并压缩。通过此方式压缩的文件只能使用“unzip -p 压缩包 > 新文件 ”来解压缩

    unzip -p 预览解压缩后的内容到屏幕,可以配置重定向将结果保存到指定文件,权限会发生变化。 

    zip工具具有打包压缩功能,但是一般要配合其他命令加管道才能使用:

    [root@CT71 app]#zip -r mima /etc/group /etc/passwd
      adding: etc/group (deflated 48%)
      adding: etc/passwd (deflated 62%)
    [root@CT71 app]#ll
    total 4
    -rw-r--r--. 1 root root 1955 Aug 10 17:58 mima.zip
    ------------------------------------------------------------------------------

    [root@CT71 app]#unzip -d lianxi mima.zip
    Archive: mima.zip
    inflating: lianxi/etc/group
    inflating: lianxi/etc/passwd
    [root@CT71 app]#ll
    total 4
    drwxr-xr-x. 2 root root 33 Aug 10 17:58 etc
    drwxr-xr-x. 3 root root 17 Aug 10 19:17 lianxi
    -rw-r--r--. 1 root root 1955 Aug 10 17:58 mima.zip
    [root@CT71 app]#cd lianxi/
    [root@CT71 lianxi]#ll
    total 0
    drwxr-xr-x. 2 root root 33 Aug 10 19:17 etc
    [root@CT71 lianxi]#cd etc/
    [root@CT71 etc]#ll
    total 8
    -rw-r--r--. 1 root root 1184 Aug 7 18:48 group
    -rw-r--r--. 1 root root 2711 Aug 7 18:48 passwd

    [root@CT71 app]#find /etc/ -type f | zip etc.zip -  -----------压缩
      adding: - (deflated 87%)
    [root@CT71 app]#ll
    total 16
    -rw-r--r--. 1 root root 13184 Aug 10 17:28 etc.zip
    [root@CT71 app]#unzip -p etc.zip > etc.zz    -------------------------解压
    [root@CT71 app]#ll
    total 116
    -rw-r--r--. 1 root root  13184 Aug 10 17:28 etc.zip
    -rw-r--r--. 1 root root 100756 Aug 10 17:29 etc.zz

    tar打包工具

       tar是一个文件归档工具,他可以将很多的文件打包成一个文件,以方便我们对文件的保存,传输,再者就是,我们的压缩工具只能对单个文件进行压缩,要是对大量单个文件进行压缩的话,必须将文件进行打包,然后在进行压缩,因此就体现出打包工具的作用。现在我们简单了解一下如何进行打包,如何解包,如何打包压缩等。

    一些参数:

       -c--create:建立新的备份文件

        -C <目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。

    -d:记录文件的差别;

    -x--extract--get:从备份文件中还原文件

    -t--list:列出备份文件的内容;

    -z--gzip--ungzip:通过gzip指令处理备份文件

    -Z--compress--uncompress:通过compress指令处理备份文件; -f<备份文件>--file=<备份文件>:指定备份文件

    -r:添加文件到已经压缩的文件;

    -u:添加改变了和现有的文件到已经存在的压缩文件;

    -j:支持bzip2解压文件

    -v:显示操作过程;

     

       -T 指定个列表,包含需要被打包的文件,以换行符为间隔

       -X 指定个排除列表,以换行符为间隔

     

    格式:tar [option] 新建文件名  要处理的文件

    示例:  

       tar –cvf etc.tar /etc/ ----将/etc/内的文件打包
       tar –xvf etc.tar  -----将etc.tar解包
       tar –jcvf etc.tar.bz2 /etc/----将/etc/内的文件打包压缩
       tar –jxvf etc.tar.bz2将etc.tar ----- 解压解包

    查看打包后的文件:

    [root@CT71 app]#tar -cvf passinfo.tar /etc/passwd /etc/shadow /etc/group /etc/gshadow
    tar: Removing leading `/' from member names
    /etc/passwd
    /etc/shadow
    /etc/group
    /etc/gshadow
    [root@CT71 app]#tar -tvf passinfo.tar 
    -rw-r--r-- root/root      2711 2017-08-07 18:48 etc/passwd
    ---------- root/root      2053 2017-08-07 18:48 etc/shadow
    -rw-r--r-- root/root      1184 2017-08-07 18:48 etc/group
    ---------- root/root      1044 2017-08-07 18:48 etc/gshadow
    [root@CT71 app]#tar -tf passinfo.tar 
    etc/passwd
    etc/shadow
    etc/group
    etc/gshadow

    向包内添加文件:

    [root@CT71 app]#tar -tvf passinfo.tar 
    -rw-r--r-- root/root      2711 2017-08-07 18:48 etc/passwd
    ---------- root/root      2053 2017-08-07 18:48 etc/shadow
    -rw-r--r-- root/root      1184 2017-08-07 18:48 etc/group
    ---------- root/root      1044 2017-08-07 18:48 etc/gshadow
    [root@CT71 app]#tar -rf passinfo.tar /etc/vimrc 
    tar: Removing leading `/' from member names
    [root@CT71 app]#tar -tvf passinfo.tar 
    -rw-r--r-- root/root      2711 2017-08-07 18:48 etc/passwd
    ---------- root/root      2053 2017-08-07 18:48 etc/shadow
    -rw-r--r-- root/root      1184 2017-08-07 18:48 etc/group
    ---------- root/root      1044 2017-08-07 18:48 etc/gshadow
    -rw-r--r-- root/root      2015 2017-08-01 16:02 etc/vimrc

    split文件分割

    当我们将很多文件打包后很大,我们可以采取将打包后的文件进行切割,分成很多小文件,将其传输后可以再把他们给复原成一个大文件

    split b Size d tar-file-name prefix-name tar包分隔为多个文件

    使用split 加上-d和不加上-d切割后的后缀是不一样的,加上-d后后缀是01,02,03……不加后缀,则是以aaabac结尾的

    cat 被分隔出的多个文件名 > 单个文件名

       示例:

    [root@CT71 app]#ll
    total 31532
    -rw-r--r--. 1 root root 32286720 Aug 10 11:43 etc.tar
    [root@CT71 app]#split -b 5M -d etc.tar etc.tar
    [root@CT71 app]#ll
    total 63064
    -rw-r--r--. 1 root root 32286720 Aug 10 11:43 etc.tar
    -rw-r--r--. 1 root root  5242880 Aug 10 11:43 etc.tar00
    -rw-r--r--. 1 root root  5242880 Aug 10 11:43 etc.tar01
    -rw-r--r--. 1 root root  5242880 Aug 10 11:43 etc.tar02
    -rw-r--r--. 1 root root  5242880 Aug 10 11:43 etc.tar03
    -rw-r--r--. 1 root root  5242880 Aug 10 11:43 etc.tar04
    -rw-r--r--. 1 root root  5242880 Aug 10 11:43 etc.tar05
    -rw-r--r--. 1 root root   829440 Aug 10 11:43 etc.tar06

    合并文件:

    [root@CT71 app]#cat etc.tar0* > etc.tar.1
    [root@CT71 app]#ll
    total 94596
    -rw-r--r--. 1 root root 32286720 Aug 10 17:43 etc.tar
    -rw-r--r--. 1 root root  5242880 Aug 10 17:43 etc.tar00
    -rw-r--r--. 1 root root  5242880 Aug 10 17:43 etc.tar01
    -rw-r--r--. 1 root root  5242880 Aug 10 17:43 etc.tar02
    -rw-r--r--. 1 root root  5242880 Aug 10 17:43 etc.tar03
    -rw-r--r--. 1 root root  5242880 Aug 10 17:43 etc.tar04
    -rw-r--r--. 1 root root  5242880 Aug 10 17:43 etc.tar05
    -rw-r--r--. 1 root root   829440 Aug 10 17:43 etc.tar06
    -rw-r--r--. 1 root root 32286720 Aug 10 17:44 etc.tar.1
    [root@CT71 app]#tar -xf etc.tar.1 
    [root@CT71 app]#ll
    total 94608
    drwxr-xr-x. 133 root root     8192 Aug 10 07:51 etc
    -rw-r--r--.   1 root root 32286720 Aug 10 17:43 etc.tar
    -rw-r--r--.   1 root root  5242880 Aug 10 17:43 etc.tar00
    -rw-r--r--.   1 root root  5242880 Aug 10 17:43 etc.tar01
    -rw-r--r--.   1 root root  5242880 Aug 10 17:43 etc.tar02
    -rw-r--r--.   1 root root  5242880 Aug 10 17:43 etc.tar03
    -rw-r--r--.   1 root root  5242880 Aug 10 17:43 etc.tar04
    -rw-r--r--.   1 root root  5242880 Aug 10 17:43 etc.tar05
    -rw-r--r--.   1 root root   829440 Aug 10 17:43 etc.tar06
    -rw-r--r--.   1 root root 32286720 Aug 10 17:44 etc.tar.1
    [root@CT71 app]#ll etc/ | less
    total 1352
    drwxr-xr-x.  3 root root      101 Jul 11 18:45 abrt
    -rw-r--r--.  1 root root       16 Jul 11 18:52 adjtime
    -rw-r--r--.  1 root root     1518 Jun  7  2013 aliases
    -rw-r--r--.  1 root root    12288 Jul 11 18:54 aliases.db
    drwxr-xr-x.  2 root root       51 Jul 11 18:46 alsa
    drwxr-xr-x.  2 root root     4096 Jul 11 18:52 alternatives
    -rw-------.  1 root root      541 Mar 31  2016 anacrontab
    -rw-r--r--.  1 root root       55 Nov  5  2016 asound.conf
    -rw-r--r--.  1 root root        1 Nov  6  2016 at.deny
    drwxr-xr-x.  2 root root       32 Jul 11 18:45 at-spi2
    drwxr-x---.  3 root root       43 Jul 11 18:46 audisp
    drwxr-x---.  3 root root       83 Jul 11 18:53 audit
    ... ...

    cpio打包压缩

    cpio 有三种操作模式:

     

    copy-out模式中, cpio 把文件复制到归档包中。它从标准输入获得文件名列表 (一行一个)。默认 把归档包写到标准输出,因此 一般 重定向到 一个文件中。生成文件名列表的典型方法是使用find 命令; 你可能要在 find 后面用上 -depth选项, 减少因为进入没有访问权限的目录而引起的麻烦。

    copy-in模式中, cpio 从归档包里读取文件, 或者列出归档包里的内容。它从标准输入读入归档包。缺省情况下,cpio从标准输入读取输入数据,向标准输出写入输出数据。

    copy-pass模式中, cpio把文件从一棵目录树复制到另一棵, 它结合了 copy-in copy-out 的操作, 但不使用归档包。 cpio从标准输入读取欲复制的文件名列表; 目标目录作为非选项的命令行参数给出。

     

    cpio支持下列的归档格式: binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, POSIX.1 tar

     

    我们针对cpio常用的参数进行讲解:

       参数:

          -o 将文件拷贝打包成文件或者将文件输出到设备上

    -i 解包,将打包文件解压或将设备上的备份还原到系统

    -t 预览,查看文件内容或者输出到设备上的文件内容

    -v 显示打包过程中的文件名称。

    -d 解包生成目录,在cpio还原时,自动的建立目录

    -c 一种较新的存储方式

    示例:

          /etc/下的普通文件打包成cpio文件存放在/app    

    [root@CT71 app]#cd /etc/
    [root@CT71 etc]#find -type f | cpio -o > /app/etc_f.cpio
    58526 blocks
    [root@CT71 etc]#cd /app/
    [root@CT71 app]#ll
    total 29264
    -rw-r--r--. 1 root root 29965312 Aug 10 11:22 etc_f.cpio
         
    浏览刚刚打包的文件内容
     
    [root@CT71 app]#cpio -vt < etc_f.cpio | less
    -rw-r--r--   1 root     root          595 Jul 11 18:42 fstab
    -rw-------   1 root     root            0 Jul 11 18:42 crypttab
    -rw-r--r--   1 root     root           70 Aug 10 07:51 resolv.conf
    -rw-r--r--   1 root     root         1160 Nov  5  2016 fonts/conf.d/25-no-bitmap-fedora.conf
    -rw-r--r--   1 root     root          978 Aug 31  2013 fonts/conf.d/README
    -rw-r--r--   1 root     root         5582 Nov  6  2016 fonts/fonts.conf
    -rw-r--r--   1 root     root         1690 Nov 30  2016 pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    -rw-r--r--   1 root     root         1004 Nov 30  2016 pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7
    -rw-r--r--   1 root     root         1690 Nov 30  2016 pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7
    -rw-r--r--   1 root     root          166 Nov  5  2016 pki/ca-trust/README
     

    新建一个目录,并将文件恢复到该目录下

     [root@CT71 app]#mkdir etc
    [root@CT71 app]#ll
    total 29264
    drwxr-xr-x. 2 root root        6 Aug 10 11:27 etc
    -rw-r--r--. 1 root root 29965312 Aug 10 11:22 etc_f.cpio
    [root@CT71 app]#cd etc/
    [root@CT71 etc]#pwd
    /app/etc
    [root@CT71 etc]#cpio -id < ../etc_f.cpio
    58526 blocks
    [root@CT71 etc]#ll
    total 1340
    drwxr-xr-x. 3 root root      101 Aug 10 11:29 abrt
    -rw-r--r--. 1 root root       16 Aug 10 11:29 adjtime
    -rw-r--r--. 1 root root     1518 Aug 10 11:29 aliases
    -rw-r--r--. 1 root root    12288 Aug 10 11:29 aliases.db
    drwxr-xr-x. 2 root root       51 Aug 10 11:29 alsa
    -rw-------. 1 root root      541 Aug 10 11:29 anacrontab
    -rw-r--r--. 1 root root       55 Aug 10 11:29 asound.conf
    -rw-r--r--. 1 root root        1 Aug 10 11:29 at.deny
    drwxr-xr-x. 2 root root       32 Aug 10 11:29 at-spi2
    drwxr-xr-x. 3 root root       43 Aug 10 11:29 audisp

      

    有时候cpio打包的文件过大,我们可以再使用压缩命令对文件进行压缩:

    [root@CT71 app]#bzip2 -k -9 etc_f.cpio
    [root@CT71 app]#ll -h
    total 38M
    drwxr-xr-x. 99 root root 8.0K Aug 10 11:29 etc
    -rw-r--r--.  1 root root  29M Aug 10 11:22 etc_f.cpio
    -rw-r--r--.  1 root root 8.8M Aug 10 11:22 etc_f.cpio.bz2

    /boot/initramfs-xxxx.img

          Centos6: cpio.gz文件。zcat initramfs-xxxx.img |cpio -id

          Centos7: cpio文件 cpio -id < initramfs-xxxx.img

     

  • 相关阅读:
    poj 3528 (三维几何求凸包+凸包表面积)
    dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)
    最大空凸包模板
    ICPC 2017–2018, NEERC, Northern Subregional Contest St Petersburg, November 4, 2017 I题
    hdu 5248 序列变换
    hdu 2063(二分图模板测试)
    组合数
    85. Maximal Rectangle 由1拼出的最大矩形
    750. Number Of Corner Rectangles四周是点的矩形个数
    801. Minimum Swaps To Make Sequences Increasing 为使两个数组严格递增,所需要的最小交换次数
  • 原文地址:https://www.cnblogs.com/duzhaoqi/p/7340571.html
Copyright © 2011-2022 走看看