zoukankan      html  css  js  c++  java
  • 文件与文件系统压缩

    在Linux下面有相当多的压缩命令可以运行,这些压缩命令可以让我们更方便地从网络上面下载容量较大的文件。此外,我们知道在Linux下面,扩展名没有什么特殊的意义。 不过,针对这些压缩命令所产生的压缩文件,为了方便记忆,还是会有一些特殊的命名方式,就让我们来看看吧!

    文件压缩

    什么是文件压缩呢?我们稍微谈一谈它的原理,目前我们使用的计算机系统中都是使用所谓的字节单位来计量。不过,事实上,计算机最小的计量单位应该是bit才对,此外,我们也知道 1字节=8比特(1Byte=8bit),但是如果今天我们只是记录一个数字,即1这个数字,它会如何记录?假设一个字节可以看成下面的模样:

    由于 1Byte=8bit,所以每个字节当中会有8个空格,而每个空格只可以是0、1

    由于我们记录的数字是1,考虑计算机所谓的二进制,如此一来,1会在最右边占据1个位,而其他的7个位将会自动地被填上0.如下图所示

    你看看,其实在这样的例子中,那7个位应该是空的才对。不过,为了要满足目前我们的操作系统数据的读写,所以就会将该数据转为字节的形式来记录。而一些聪明的计算机工程师就利用一些复杂的计算方式,将这些没有使用到的空间【丢】出来,以让文件占用的空间变小,这就是压缩的技术。
    另一种压缩技术也很有趣,它是将重复的数据进行统计记录。举例来说,如果你的数据为【111······】共有100个1时,那么压缩技术会记录为【100个1】而不是真的有100个1的位存在。这样也能够精简文件记录的容量,非常有趣吧!
    简单地说,你可以将它想成,其实文件里面有相当多的空间存在,并不是完全填满的,而压缩技术就是将这些空间填满,以让整个文件占用的容量下降。不过,这些压缩过的文件并无法直接被我们的操作系统所使用,因此,若要使用这些被压缩过的文件数据,则必须将它还原回未压缩前的模样,那就是所谓的解压缩。而至于压缩后与压缩的文件所占用的磁盘空间大小,就可以被称为是压缩比
    这个压缩与解压缩的操作有什么好处呢?
    1.最大的好处就是压缩过的文件容量变小了,所以你的硬盘无形之中就可以容纳更多的数据。
    2.此外,在一些网络数据的传输中,也会由于数据量的降低,好让网络带宽可以用来做更多的工作,而不是老卡在一些大型文件传输上面。

    Linux系统常见压缩命令

    在Linux的环境中,压缩文件的扩展名大多是: *.tar、*.tar.gz、*.gz、*.Z、*.bz2、*.xz。为什么会有这样的扩展名?不是说Linux的扩展名没有什么作用吗?
    这是因为Linux支持的压缩命令非常多,且不同的命令所用的压缩技术并不相同,当然彼此之间可能就无法互通/解压缩文件。所以,当你下载到某个文件时,自然就需要知道该文件是由哪种压缩命令所制作出来的,好用来对照对照着解压缩,也就是说,虽然Linux文件的属性基本上是与文件名没有绝对关系的,但是为了帮助我们人类小小的脑袋,所以适当的扩展名还是必要的,下面我们就列出几个常见的压缩文件扩展名:

    *.gz         gzip程序压缩的文件
    *.bz2        bzip2程序压缩的文件
    *.xz         xz程序压缩的文件
    *.zip        zip程序压缩的文件
    *.Z          compress程序压缩的文件
    *.tar        tar程序打包的文件,并没有压缩过
    *.tar.gz     tar程序打包的文件,并且经过gzip的压缩
    *.tar.bz2    tar程序打包的文件,并且经过bzip2的压缩
    *.tar.xz     tar程序打包的文件,并且经过xz的压缩
    

    Linux常见的压缩命令就是gzip、bzip2以及最新的xz,至于compress已经不流行了。为了支持windows常见的zip,其实Linux也早就有zip命令了。gzip是由GNU计划所开发出来的压缩命令,该命令支持已经替换了compress。后台GNU又开发出了bzip2及xz这几个压缩比更好的压缩命令。不过,这些命令通常仅能针对一个文件来压缩与解压缩,如此一来,每次压缩与解压缩都要一大堆文件,岂不烦人?此时,这个所谓的【打包软件,tar】就显得很重要。
    这个tar可以将很多文件打包成一个文件,甚至是目录也可以这么玩。不过,单纯的tar功能仅仅是打包而已,即将很多文件结合为一个文件,事实上,它并没有提供压缩的功能,后台,GNU计划中,将整个tar与压缩的功能结合在一起,如此一来,提供用户更方便且更强大的压缩与打包功能,下面我们就来谈一谈这些在Linux下面基本的压缩命令。

    gzip

    gzip可以说是应用最广的压缩命令了,目前gzip可以解开compress、zip和gzip等软件所压缩的文件,至于gzip所建立的压缩文件为*.gz,让我们来看看这个命令的语法:

    gzip [-cdtvn] 文件名
    选项与参数:
    -c: 将压缩的数据输出到屏幕上,可通过数据流重定向来处理;
    -d: 解压缩的参数;
    -t: 可以用来检验一个压缩文件的一致性,看看文件有无错误;
    -v: 可以显示出原文件/压缩文件的压缩比等信息;
    -n: n为数字的意思,代表压缩等级,-1最快,但压缩比最差,-9最慢,但是压缩比最好,默认是-6
    

    示例1:压缩文件(gzip -v 文件名)

    示例2:解压缩文件(gzip -d 文件名)

    示例3:按照指定压缩比压缩(gzip -9 文件名)

    示例4:查看压缩文件的内容(zcat 文件名)

    示例5:压缩为指定文件名(gzip -c 文件名 > 指定文件名)

    当你使用gzip进行压缩时,在默认的状态下原本的文件会被压缩成为.gz后缀的文件,源文件就不存在了,这点与一般习惯使用Windows做压缩的朋友所熟悉的情况不同,要注意。cat/more/less可以使用不同的方式来读取纯文本文件,那么zcat/zmore/zless则可以对应于cat/more/less的方式来读取纯文件文件被压缩后的压缩文件。

    bzip2

    若说gzip是为了替换compress并提供更好的压缩比而成立的,那么bzip2则是为了替换gzip并提供更加的压缩比而来。bzip2真是很不错的东西,这玩意的压缩比竟然比gzip还要好,至于bzip2的用法几乎与gzip相同,看看下面的用法吧!

    bzip2 [-cdkzvn] 文件名
    选项与参数:
    -c: 将压缩的数据输出到屏幕上,可通过数据流重定向来处理;
    -d: 解压缩的参数;
    -k: 保留原始文件,而不是删除原始文件;
    -z: 压缩的参数(默认值,可以不加);
    -v: 可以显示出原文件/压缩文件的压缩比等信息;
    -n: n为数字的意思,代表压缩等级,-1最快,但压缩比最差,-9最慢,但是压缩比最好,默认是-6
    

    示例:

    bzip2 -v 待压缩文件名
    bzip2 -d 压缩后的文件名
    bzip2 -9 -c 待压缩的文件名 > 自定义压缩文件名
    

    xz

    虽然bzip2已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推出了xz这个压缩比更高的软件。这个软件的用法也跟gzip/bzip2几乎一模一样,那我们就来看一看。

    xz [-cdtlkn] 文件名
    选项与参数:
    -c: 将压缩的数据输出到屏幕上,可通过数据流重定向来处理;
    -d: 解压缩的参数;
    -k: 保留原始文件,而不是删除原始文件;
    -l: 列出压缩文件的相关信息;
    -t: 测试压缩文件的完整性,看看有没有错误;
    -z: 压缩的参数(默认值,可以不加);
    -n: n为数字的意思,代表压缩等级,-1最快,但压缩比最差,-9最慢,但是压缩比最好,默认是-6
    

    示例:

    xz -v 待压缩的文件名
    xz -l 压缩后的文件名
    xz -d 压缩后的文件名
    xz -k 待压缩的文件名
    

    打包命令

    前面谈到的命令大多仅能针对单一文件来进行压缩,虽然gzip、bzip2、xz也能够针对目录来进行压缩,不过,这几个命令对目录的压缩指的是将目录内的所有文件【分别】进行压缩的操作。而不像在Windows的系统,可以使用类似WinRAR这一类的压缩软件来将好多数据包成一个文件的样式。
    这种将多个文件或目录包成一个大文件的命令功能,我们可以称它是一种打包命令,那Linux有没有这种打包命令?有,那就是大名鼎鼎的tar,tar可以将多个目录或文件打包成一个大文件,同时还可以通过gzip、bzip2、xz的支持,将该文件同时进行压缩。更有趣的是,由于tar的使用太广泛了,目前Windows的WinRAR也支持.tar.gz文件名的解压缩。

    tar

    tar的选项与参数特别多,我们只讲几个常用的选项,更多选项您可以自行man tar查询。

    tar [-z|-j|-J] [cv] [-f 待建立的新文件名] filename... <== 打包与压缩。
    tar [-z|-j|-J] [cv] [-f 既有的tar文件名]  <== 查看文件名
    tar [-z|-j|-J] [xv] [-f 既有的tar文件名]  <== 解压缩
    选项与参数:
    -c: 建立打包文件,可搭配-v来查看过程中被打包的文件名(filename);
    -t: 查看打包文件的内容含有那些文件名,重点在查看【文件名】;
    -x: 解包或解压缩功能,可以搭配-C(大写)在特定目录解压,特别留意的是,-c、-t、-x不可同时出现在一串命令行中;
    -z: 通过gzip的支持进行压缩/解压缩: 此时文件名最好为*.tar.gz;
    -j: 通过bzip2的支持进行压缩/解压缩:此时文件名最好为*.tar.bz2;
    -J: 通过xz的支持进行压缩/解压缩: 此时文件名最好为 *.tar.xz,特别留意,-z、-j、-J不可以同时出现在一串命令行中;
    -v: 在压缩/解压缩的过程中,将正在处理的文件名显示出来;
    -f filename: -f后面要立刻接要被处理的文件名,建议-f单独写一个选项(比较不会忘记)。
    -C 目录: 这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项
    -p(小写): 保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件;
    -P(大写): 保留绝对路径,亦即允许备份数据中含有根目录存在之意
    

    其实最简单的使用tar就只要记住下面的命令即可:

    • 压缩: tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称;
    • 查询: tar -jtv -f filename.tar.bz2
    • 解压缩: tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

    示例:

    tar -zcvf 文件名.tar.gz 文件名(目录)

    tar -ztvf 文件名.tar.gz

    tar -zxvf 文件名.tar.gz

    资料:
    鸟哥的Linux私房菜(第四版)

  • 相关阅读:
    JDK8的JVM内存模型小结
    揭开Service Mesh的神秘面纱
    通过Shell脚本读取properties文件中的参数时遇到 换行符的问题
    NodeJs+Express实现简单的Web增删改查
    SpringBoot之Thymeleaf模板引擎
    面向对象(下)
    内部类
    线程学习oneday
    Python-使用tkinter实现的Django服务进程管理工具
    Python-使用百度文字识别API实现的文字识别工具
  • 原文地址:https://www.cnblogs.com/itbsl/p/11934158.html
Copyright © 2011-2022 走看看