当前位置: 首页 > news >正文

【Linux】压缩命令——gzip,bzip2,xz

1.压缩文件的用途与技术

  1. 你是否有过文件太大,导致无法以正常的E-mail方式发送?
  2. 又或学校、厂商要求使用CD或DVD来做数据归档之用,但是你的单一文件却都比这些传统的一次性存储媒介还要大,那怎么分成多块来刻录?
  3. 还有,你是否有过要备份某些重要数据,偏偏这些数据量太大,使用了你很多的磁盘空间?

这个时候,这个好用的文件压缩技术可就派的上用场了。

        这些比较大型的文件通过所谓的文件压缩技术之后,可以将它的磁盘使用量降低,从而达到降低文件容量的效果。此外,有的压缩程序还可以进行容量限制,使一个大型文件可以划分成为数个小型文件,以方便携带。

那么什么是文件压缩呢?

        我们来稍微谈一谈它的原理,目前我们使用的计算机系统中都是使用所谓的字节单位来计量。不过,事实上,计算机最小的计量单位应该是bit才对,此外,我们也知道1Byte=8bit,但是如果今天我们只是记忆一个数字,即1这个数字?它会如何记录?

        假设一个字节可以看成八个空格,由于1B=8bit,所以每个字节当中会有8个空格,而每个空格可以是0、1,由于我们记录数字是1,考虑计算机所谓的二进制,如此一来,1会在最右边占据1个位,而其他的7个位将会自动地被填上0。

        你看看,其实在这样的例子中,那7个位应该是空的才对。不过,为了要满足目前我们的操作系统数据的读写,所以就会将该数据转为字节的形式来记录。

而一些聪明的计算机工程师就利用一些复杂的计算方式,将这些没有使用到的空间【丢】出来,以让文件占用的空间变小,这就是压缩的技术。

        另外一种压缩技术也很有趣,它是将重复的数据进行统计记录。举例来说,如果你的数据为【111……】共有100个1时,那么压缩技术会记录为【100个1】而不是真的有100个1的位存在。这样也能够精简文件记录的容量,非常有趣吧!

        简单地说,你可以将它想成,其实文件里面有相当多的空间存在,并不是完全填满的,而压缩的技术就是将这些空间填满,以让整个文件占用的容量下降。

        不过,这些压缩过的文件并无法直接被我们的操作系统所使用,因此,若要使用这些被压缩过的文件数据,则必须将它还原回来未压缩前的模样,那就是所谓的解压缩。

        而至于压缩后与压缩的文件所占用的磁盘空间大小,就可以被称为是压缩比,

这个压缩与解压缩的操作有什么好处呢?

最大的好处就是压缩过的文件容量变小了,所以你的硬盘容量无形之中就可以容纳更多的数据。

        此外,在一些网络数据的传输中,也会由于数据量的降低,好让网络带宽可以用来做更多的工作,而不是老卡在一些大型的文件传输上面,目前很多的WWW网站也是利用文件压缩的技术来进行数据的传送,好让网站带宽的利用率上升。

        上述的WWW网站压缩技术蛮有趣的,它让你网站上面看得到的数据在经过网络传输时,使用的是压缩过的数据,等到这些压缩过的数据到达你的计算机主机时,再进行解压缩,由于目前的计算机命令周期相当快速,因此其实在网页浏览的时候,时间都是花在数据的传输上面,而不是CPU的运算,如此一来,由于压缩过的数据量降低了,自然传输的速度就会变快不少。

若你是一位软件工程师,那么相信你也会喜欢将你自己的软件压缩之后提供大家下载来使用,毕竟没有人喜欢自己的网站天天都是带宽满载的吧?

举个例子来说,Linux 3.10.81(CentOS7用的扩展版本)完整的内核大小约有570MB左右,而由于内核主要多是 ASCII的纯文本文件,这种文件的多余空间最多,而一个提供下载的压缩的3.10.81内核大约仅有76MB左右,差了多少?你可以自己算一算。

2. Linux 系统常见的压缩命令

        在Linux的环境中,压缩文件的扩展名大多是:“.tar、*tar.gz、*tgz、“.gz、“Z、“.b22、“xz。

为什么会有这样的扩展名?不是说Linux的扩展名没有什么作用吗?

这是因为Linux支持的压缩命令非常多,且不同的命令所用的压缩技术并不相同,当然彼此之间可能就无法互通压缩/解压缩文件。

所以,当你下载到某个压缩文件时,自然就需要知道该文件是由哪种压缩命令所制作出来的,好用来对照着解压缩,也就是说,虽然 Linux文件的属性基本上是与文件名没有绝对关系的,但是为了帮助我们人类小小的脑袋,所以适当的扩展名还是必要的

下面我们就列出几个常见的压缩文件扩展名:

  1. .Z:compress 程序压缩的文件
  2. .zip:zip程序压缩的文件
  3. .gz:gzip程序压缩的文件
  4. .bz2:bzip2程序压缩的文件
  5. .xz:xz程序压缩的文件
  6. .tar:tar 程序打包的文件,并没有压缩过;
  7. .tar.gz:tar程序打包的文件,并且经过gzip的压缩
  8. .tar.bz2:tar 程序打包的文件,并且经过bzip2的压缩
  9. .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下面基本的压缩命令。

2.1 gzip, zcat/zmore/zless/zgrep

gzip可以说是应用最广的压缩命令了,目前gzip可以解开compress、zip与gzip等软件所压缩的文件,至于gzip所建立的压缩文件为.gz

让我们来看看这个命令的语法;

[dmtsai@study~JS gzip [-cdtv#]文件名
[dmtsai@study-]S zcat 文件名.gz

选项与参数:

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

范例一:找出/etc 下面(不含子目录)容量最大的文件,并将它复制到/tmp,然后以gzip压缩。


 

当你使用gzip进行压缩时,在默认的状态下原本的文件会被压缩成为.gz后缀的文件,源文件就不再存在了,这点与一般习惯使用Windows做压缩的朋友所熟悉的情况不同,要注意。

此外,使用gzip压缩的文件在Windows系统中,竟然可以被WinRAR或7zip这些软件解压缩,很好用,其他的用法如下:

范例二:由于services是文本文件,请将范例一的压缩文件的内容读出来。

由于services 这个原本的文件是是文本文件,因此我们可以尝试使用zcat/zmore/zless去读取。
此时屏幕上会显示servcies.gz解压缩之后的原始文件内容。

范例三:将范例一的文件解压缩。

不要使用gunzip这个命令,不好背,使用gzip-d来进行解压缩.
与gzip相反,gzip-d会将原本的.gz删除,恢复到原本的services文件。

范例四:将范例三解开的services用最佳的压缩比压缩,并保留原本的文件。

范例五:由范例四再次建立的services.gz中,找出http这个关键词在哪几行?

        其实gzip的压缩已经优化过了,所以虽然gzip提供1~9的压缩等级,不过使用默认的6就非常好用了。因此上述的范例四可以不要加入那个-9的选项。

        范例四的重点在那个-c与>的使用,-c可以将原本要转成压缩文件的数据内容,将它变成文字类型从屏幕输出,然后我们可以通过大于(>)这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不是屏幕,所以就能够建立出压缩文件了。只是文件名也要自己写,当然最好还是遵循gzip的压缩文件名要求较佳。

        cat/more/less可以使用不同的方式来读取纯文本文件,那个 zcat/zmore/zless则可以对应于cat/more/less 的方式来读取纯文本文件被压缩后的压缩文件,

        由于gzip这个压缩命令主要想要用来替换compress,所以不但compress的压缩文件可以使用gzip来解开,同时zcat这个命令可以同时读取compress与gzip的压缩文件。

        另外,如果你还想要从文字压缩文件当中找数据的话,可以通过egrep来查找关键词,而不需要将压缩文件解开才以grep进行,这对查询备份中的文本文件数据相当有用。

        时至今日,应该也没有人使用compress这个老的命令。而如果你还有备份数据使用的是compress创建出来的,Z文件,那也无须担心,使用znew 可以将该文件转成 gzip的格式.

2.2 bzip2,bzcat/bzmore/bzless/bzgrep

若说gzip 是为了替换compress并提供更好的压缩比而成立的,那么bzip2则是为了替换gzip并提供更佳的压缩比而来。

bzip2真是很不错的东西,这玩意的压缩比竟然比gzip 还要好,至于bzip2的用法几乎与gzip 相同,看看下面的用法吧!

[dmtsai@study ~]$ bzip2 [-cdkzv#]文件名
[dmtsai@study ~]$ bzcat 文件名.bz2

选项与参数:

  • -c:将压缩的过程产生的数据输出到屏幕上;-d:解压缩的参数;
  • -d:保留原始文件,而不会删除原始的文件;
  • -k:压缩的参数(默认值,可以不加);
  • -v:可以显示出源文件/压缩文件的压缩比等信息:
  • -#:与gzip 同样的,都是计算压缩比的参数,-9最佳,-1 最快:

例一、将刚刚gzip 范例留下来的/tmp/services以bzip2压缩。


此时services 会变成 services.bz2之外,你也可以发现bzip2的压缩比要软gzip好。
压缩率由gzip的79%提升到bzip2的81%。

同样,它会把源文件删除!!!!

范例二:将范例一的文件内容读出来。

范例三:将范例一的文件解压缩。

范例四:将范例三解开的services用最佳的压缩比压缩,并保留原本的文件。

看上面的范例,你会发现到bzip2连选项与参数都跟gzip一模一样,只是扩展名由.gz变成.bz2而已。其他的用法都大同小异,所以就不一一介绍了

你也可以发现到bzip2的压缩率确实比gzip要好些,不过,对于大容量文件来说,bzip2压缩时间会花比较久,至少比gzip要久的多,这没办法,要有更多可用容量,就要花费相对应的时间。

2.3 xz, xzcat/xzmore/xzless/xzgrep

虽然bzip2已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推出了xz这个压缩比更高的软件。

 这个软件的用法也跟gzip/bzip2几乎一模一样,那我们就来看一看。

xz [-dtlkc#] 文件名
xcat 文件名.xz

选项与参数:

  • -d:就是解压缩;
  • -t:测试压缩文件的完整性,看有没有错误;
  • -l:列出压缩文件的相关信息;
  • -k:保留原本的文件不删除;
  • -c:同样的,就是将数据在屏幕上输出的意思;
  • -#:同样的,也有较佳的压缩比的意思;

范例一:将刚刚由bzip2所遗留下来的/tmp/services通过x2来压缩。

#各位观众,看到没有,容量又进一步下降的更多,好棒的压缩比。

范例二:列出这个压缩文件的信息,然后读出这个压缩文件的内容。

竟然可以列出这个文件的压缩前后的容量,真是太人性化了,这样观察就方便多了

同样的我们可以使用xzcat来预览压缩包里的东西

范例三:将它解压缩吧!

范例四:保留原文件的文件名,并且建立压缩文件。

xz 这个压缩比真的好太多太多了,鸟哥选择的这个services文件为范例,它可以将gzip压缩比(压缩后/压缩前)的21%更进一步优化到15%,差非常非常多。

不过,xz最大的问题是时间花太久了。

如果你曾经使用过xz的话,应该会发现,它的运算时间真的比gzip久很多。

通过【time [gziplbzip2lxz]-cservices>services.[gzlbz2|xz]】去执行运算,结果发现这三个命令的运行时间依序是:0.019s、0.042s、0.261s。

看最后一个数字,差了10倍的时间。

所以,如果你并不觉得时间是你的成本考虑,那么使用xz会比较好。如果时间是你的重要成本那么gzip恐怕是比较适合的压缩软件。
 

相关文章:

【Linux】压缩命令——gzip,bzip2,xz

1.压缩文件的用途与技术 你是否有过文件太大,导致无法以正常的E-mail方式发送?又或学校、厂商要求使用CD或DVD来做数据归档之用,但是你的单一文件却都比这些传统的一次性存储媒介还要大,那怎么分成多块来刻录?还有&am…...

【Java13】包

“包”这个机制,类似于分组。主要作用是区分不同组内的同名类。例如,高三三班有一个“王五”,高二八班也有一个“王五”。高三三班和高三八班就是两个不同的包。 Java中的包(package)机制主要提供了类的多层命名空间&…...

从零到一:Python自动化测试的详细指南!

引言: Python是一种功能强大且易于学习和使用的编程语言,它非常适合用于自动化测试。本文将从零开始,通过详细的步骤和规范,介绍如何在Python中实施高质量的自动化测试。我们将探讨测试策略的制定、测试框架的选择、测试用例的编…...

iOS中多个tableView 嵌套滚动特性探索

嵌套滚动的机制 目前的结构是这样的,整个页面是一个大的tableView, Cell 是整个页面的大小,cell 中嵌套了一个tableView 通过测试我们发现滚动的时候,系统的机制是这样的, 我们滑动内部小的tableView, 开始滑动的时候&#xff0c…...

TCP/IP模型和OSI模型的区别

OSI模型, 是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,将计算机网络通信划分为七个不同的层级,每个层级都负责特定的功能。每个层级都构建在其下方的层级之上,并为上方的层级提供…...

(九)绘制彩色三角形

前面的学习中并未涉及到颜色&#xff0c;现在打算写一个例子&#xff0c;在顶点着色器和片元着色器中加入颜色&#xff0c;绘制有颜色的三角形。 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostream>void …...

短信群发平台适用于哪些行业?

短信群发平台作为一种高效、快速且成本相对较低的通信方式&#xff0c;适用于多个行业。以下是一些主要适用行业的概述&#xff1a; 1. 零售与电商行业 应用场景&#xff1a;零售和电商企业可以利用短信群发进行新品推广、促销信息发布、订单状态更新、物流跟踪通知等。 2. 金…...

1. 倍数

倍数 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 请问在 11 到 20202020 中&#xff0c;有多少个数既是 44 的整数倍&#xff0c;又是 66 的整数倍。 运行限制 最大运行时间&#xff1a;1s最大运行内存: 12…...

C#常用关键字举例

关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符&#xff0c;但是&#xff0c;如果您想使用这些关键字作为标识符&#xff0c;可以在关键字前面加上 字符作为前缀。 class: public class MyClass {// Class definition }interface: public interface IMyInterfac…...

stm32——外部中断EXTI

上回书说到定时器的级联&#xff0c;今天来谈谈外部中断EXTI。我使用的是STM32F103C8T6的学习板。仅供大家参考。 什么是中断呢&#xff1f;中断是指计算机在执行程序的过程中&#xff0c;当出现某些异常情况或特殊事件&#xff08;例如外部设备请求、定时时间到达、程序错误等…...

Solidity:变量数据存储和作用域 storage/memory/calldata

Solidity中的引用类型​ 引用类型(Reference Type)&#xff1a;包括数组&#xff08;array&#xff09;和结构体&#xff08;struct&#xff09;&#xff0c;由于这类变量比较复杂&#xff0c;占用存储空间大&#xff0c;我们在使用时必须要声明数据存储的位置。 数据位置​ …...

ElementUI中的el-table解决宽度问题 - 根据内容自动撑开

在使用element-ui中&#xff0c;会发现表格组件el-table在未指定宽度情况下&#xff0c;会自动计算并给表格宽度赋值。但实际开发中&#xff0c;有时需要根据内容实际长度自动撑开显示&#xff0c;由内容的多少而决定表格的宽度&#xff0c;而不是默认宽度为100%。在默认情况下…...

react apollo hooks

1、创建ApolloProvider来包装整个程序 <ApolloProvider client{client}><App /> <ApolloProvider> 2、useQuery查询 工作方式usequery将返回一个数组 const {要返回的对象} useQuery(传入参数) 实例 const query gqlquery name {whatever {field}} e…...

Android 10.0 SystemUI启动流程

1、手机开机后&#xff0c;Android系统首先会创建一个Zygote&#xff08;核心进程&#xff09;。 2、由Zygote启动SystemServer。 3、SystemServer会启动系统运行所需的众多核心服务和普通服务、以及一些应用及数据。例如&#xff1a;SystemUI 启动就是从 SystemServer 里启动的…...

洛谷 P1032 [NOIP2002 提高组] 字串变换

P1032 [NOIP2002 提高组] 字串变换 - 洛谷 | 计算机科学教育新生态 题目来源 洛谷 题目内容 [NOIP2002 提高组] 字串变换 题目背景 本题不保证存在靠谱的多项式复杂度的做法。测试数据非常的水&#xff0c;各种做法都可以通过&#xff0c;不代表算法正确。因此本题题目和…...

网络资源模板--Android Studio 外卖点餐App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 原创外卖点餐&#xff1a;基于Android studio 实现外卖(点)订餐系统 非原创奶茶点餐&#xff1a;网络资源模板--基于 Android Studio 实现的奶茶点餐App报告 一、项目演示 网络资源模板--基于Android …...

【Linux】网络新手村

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 今天&#xff0c;我们就开始学习Linux网络相关的内容。这篇博客作为Linux网络板块的第一篇博客看&#xff0c;我们首先要带着大家明白Linux网络的一些名词的概念&#xff0c;为之后的学习扫清障碍。然后我…...

123123

123123...

在pycharm中使用jupyter

在pycharm中使用jupyter 前置条件&#xff1a;你的环境中应该有juptyer &#xff0c;没有的话 pip install jupyter 点击项目目录&#xff0c;右键->new->jupyter notebook 打开file settings 找到 jupyter server &#xff08;按照默认的用代理服务器就行&#xff09; P…...

MongoDB:掌握核心常用命令语句,精通数据操作

标题:MongoDB:掌握核心命令,精通数据操作 前言: MongoDB 是一种非关系型数据库,以文档为中心,使用 JSON 格式的 BSON 来存储数据。它具有高可用性、高性能和易于扩展的特点,被广泛应用于各种规模的项目中。本文将详细介绍 MongoDB 的常用命令,帮助你更好地理解和掌握…...

Redis中测试Stream的例子

当你想要测试 Redis 中的 Stream 功能时&#xff0c;可以通过 Redis 的命令行客户端或者使用任何支持 Redis 的编程语言来操作。下面我会给出一个简单的例子&#xff0c;使用 Redis 的命令行客户端 redis-cli 来测试 Stream 的基本功能。 准备工作 确保你已经安装并启动了 Re…...

28 H3C SecPath F1000 概览(主要功能是总 观看全局)

28 H3C SecPath F1000 概览(主要功能是总 观看全局) 特性简介 概览页面通过清晰的图形化模块清晰展示了设备关键数据信息及各类状态&#xff0c;并支持灵活排版布局&#xff0c;以便实时查看用户关心的数据。预定义监控默认展示了设备基础信息模块&#xff0c;也可以手动添加其…...

标准版视频检测终端功能有哪些? 捷顺高清视频车位引导系统怎么样?

随着城市化进程的加速&#xff0c;城市交通压力日益增大&#xff0c;停车难问题成为了许多城市居民的共同困扰。在这样的背景下&#xff0c;车位引导系统的出现&#xff0c;无疑为解决这一难题提供了一种有效的解决方案。车位引导系统利用先进的信息技术&#xff0c;通过实时监…...

说明本文档目录是软件开发梳理需求常见问题QA文档,方便客户看,也方便我们的售前人员,需求分析人员,ui设计师,原型绘图人员,思维导图绘图人员查看。

https://doc.youyacao.com/117/2150 说明 本文档目录是软件开发梳理需求常见问题QA文档&#xff0c;方便客户看&#xff0c;也方便我们的售前人员&#xff0c;需求分析人员&#xff0c;ui设计师&#xff0c;原型绘图人员&#xff0c;思维导图绘图人员查看。 提示 本内容客户…...

Echarts桑基图

关于Echarts的使用方法参考&#xff1a;vue2中echarts的使用_vue2中使用echarts-CSDN博客 实现效果&#xff1a; 代码&#xff1a; var sysT {"用采": #2D9BFF,"营销系统": #39BFFF,"ERP": #76C2FF,"财务管控": #5F57FC,"PMS&…...

wordpress网站添加一个临时维护功能

把以下代码放到functions.php文件中&#xff0c;主要用网站临时维护或者用于备案。事情做好了&#xff0c;把以下代码删除即可&#xff01;&#xff01;&#xff01; 有时遇到一些情况&#xff0c;比如站点需要闭站备案、或者被要求停站等等&#xff0c;我们就可以使用本文的功…...

充电桩开源平台,开发流程有图有工具

慧哥充电桩开源平台产品研发流程是确保产品从概念阶段到市场推广阶段的有序进行的关键。以下是对您给出的步骤的详细解释和建议&#xff1a; 设计业务流程: 在这一步&#xff0c;团队需要确定产品的核心功能、目标用户以及如何满足用户需求。进行市场调研&#xff0c;了解竞争…...

数据中台设计书及建设指南(中台及大数据解决技术方案)

1. 中台概念 2. 推动企业组织模式演进 3. 建设方法 4 .中台内容 5. 数据安全体系 中台内容围绕数据中台建设评估、整体框架、数据采集&#xff0c;结构化、半结构化、非结构化的数据采集&#xff0c;数据计算能力、存储计算引擎、数据架构、数据挖掘、各种不同数据层建设、模型…...

合合信息大模型“加速器”重磅上线

大模型技术的发展和应用&#xff0c;预示着更加智能化、个性化未来的到来。如果将大模型比喻为正在疾驰的科技列车&#xff0c;语料便是珍贵的“燃料”。本次世界人工智能大会期间&#xff0c;合合信息为大模型打造的“加速器”解决方案备受关注。 在大模型训练的上游阶段&…...

# Sharding-JDBC 从入门到精通(10)- 综合案例(三)查询商品与测试及统计商品和总结

Sharding-JDBC 从入门到精通&#xff08;10&#xff09;- 综合案例&#xff08;三&#xff09;查询商品与测试及统计商品和总结 一、Sharding-JDBC 综合案例-查询商品-dao 1、查询商品&#xff1a;Dao 实现&#xff1a;在 ProductDao 中定义商品查询方法&#xff1a; //查询商…...