如何在 Linux 上使用 Gzip 压缩和解压缩文件

已发表: 2022-06-28
红色背景上的 Linux 终端。
fatmawati achmad zaenuri/Shutterstock.com

有许多文件压缩实用程序,但可以保证在每个 Linux 发行版上都能找到gzip 。 如果你只学习使用一种压缩工具,那应该是gzip

相关:文件压缩如何工作?

算法和树

gzip数据压缩工具是在 1990 年代初编写的,它仍然存在于每个 Linux 发行版中。 还有其他可用的压缩工具,但无论您发现自己需要在哪台 Linux 计算机上工作,都可以在上面找到gzip 。 因此,如果您知道如何使用gzip ,那么您无需安装任何东西就可以使用。

gzip是 DEFLATE 算法的实现,该算法由 PKZIP 的 Phil Katz 发明并获得专利。 DEFLATE 算法改进了早期的压缩算法,这些算法都对主题的变化进行操作。 扫描要压缩的数据,识别唯一字符串并将其添加到二叉树中。

唯一的字符串根据它们在树中的位置被分配一个唯一的 ID 标记。 标记用于替换数据中的字符串,并且由于标记小于它们替换的数据,因此文件被压缩。 将标记替换为原始字符串会将数据重新膨胀回其未压缩状态。

基准测试:最好的文件压缩格式是什么?
相关基准:最好的文件压缩格式是什么?

DEFLATE 算法增加了一个扭曲,即最常遇到的字符串被分配最小的标记,而最不经常遇到的字符串被分配更大的标记。 DEFLATE 算法还结合了两种早期压缩方法的思想,即霍夫曼编码和 LZ77 压缩。

在撰写本文时,DEFLATE 算法已有近三个十年的历史。 三十年前,数据存储成本高,传输速度慢。 数据压缩至关重要。

在 Linux 上释放磁盘空间的 4 种方法
相关4 种在 Linux 上释放磁盘空间的方法

今天的数据存储要便宜得多,传输速度要快几个数量级。 但是我们有更多的数据要存储,全世界的人们都在访问云存储和流媒体服务。 数据压缩仍然至关重要,即使您所做的只是缩小需要上传或传输的内容,或者您​​正试图收回本地硬盘驱动器上的一些空间。

gzip 命令

文件越大,压缩效果越好。 这是因为两个原因。 一是在一个大文件中会有许多重复的、相同的字节序列。 第二个原因是字符串和标记的列表需要存储在压缩文件中,以便可以进行解压缩。 对于一个非常小的文件,开销可以消除压缩的好处。 但即使文件相当小,大小也可能会有所减少。

压缩文件

要压缩文件,您只需将文件名传递给gzip命令即可。 我们将检查文件的原始大小,对其进行压缩,然后检查压缩文件的大小。

 ls -lh calc-sheet.ods
 gzip calc-sheet.ods
 ls -lh 校准 -* 

压缩电子表格

原始文件(名为“calc-sheet.ods”的电子表格)为 11 KB,压缩文件(也称为存档文件)为 9.3 KB。 请注意,存档文件的名称是原始文件的名称,并附加了“.gz”。

ls命令的第一次使用针对特定文件,即电子表格。 ls的第二次使用查找所有以“calc-”开头的文件,但它只查找压缩文件。 这是因为,默认情况下, gzip会创建存档文件并删除原始文件。

那不是问题。 如果您需要原始文件,您可以从存档文件中检索它。 但如果您更喜欢保留原始文件,可以使用-k (保留)选项。

 gzip -k calc-sheet.ods
 ls -lh 计算表。* 

压缩文件并保留原始文件

这次保留了原始 ODS 文件。

解压文件

要解压缩 GZ 存档文件,请使用-d (解压缩)选项。 这将从存档中提取压缩文件并解压缩,使其与原始文件无法区分。

 ls 计算表。*
 gzip -d 计算表.ods.gz
 ls 计算表。* 

使用 gzip 解压文件

这一次,我们可以看到gzip在解压原文件后已经删除了归档文件。 要保留存档文件,我们需要再次使用-k (保留)选项以及-d (解压缩)选项。

 ls 计算表。*
 gzip -d 计算表.ods.gz
 ls 计算表。* 

解压文件并保留存档文件

这一次,gzip 不会删除存档文件。

相关:为什么可以恢复已删除的文件,以及如何防止它

解压和覆盖

如果您尝试在存在原始文件(或具有相同文件的不同文件)的目录中提取文件, gzip将提示您选择放弃提取或覆盖现有文件。

 gzip -d 文本文件.txt.gz 

当归档文件中的文件已存在于目录中时,来自 gzip 的覆盖提示

如果您事先知道您很高兴目录中的文件被存档中的文件覆盖,请使用 -f(强制)选项。

 gzip -df 文本文件.txt.gz 

强制覆盖现有文件

该文件被覆盖,您将静默返回到命令行。

压缩目录树

-r (递归)选项使gzip压缩整个目录树中的文件。 但结果可能不是你所期望的。

这是我们将在此示例中使用的目录树。 每个目录都包含一个文本文件。

 树级别1 

测试目录树结构

让我们在目录树上使用gzip看看会发生什么。

 gzip -r level1/
 树级别1 

运行 gzip 后的目录结构

结果是gzip为目录结构中的每个文本文件创建了一个存档文件。 它没有创建整个目录树的存档。 实际上, gzip只能将单个文件放入存档中。

我们可以创建一个包含目录树及其所有文件的存档文件,但我们需要使用另一个命令。 tar程序用于创建许多文件的存档,但它没有自己的压缩例程。 但是通过tar使用适当的选项,我们可以使tar通过gzip推送存档文件。 这样我们就得到了一个压缩的存档文件和一个多文件或多目录的存档。

 tar -czvf level1.tar.gz level1

tar选项是:

  • c :创建档案。
  • z :通过gzip推送文件。
  • v :详细模式。 在终端窗口中打印tar在做什么。
  • f level1.tar.gz :用于归档文件的文件名。

tar 的输出通过目录树工作

这会归档目录树结构和目录树中的所有文件。

相关:如何在 Linux 上使用 tar 命令压缩和提取文件

获取有关档案的信息

-l (列表)选项提供有关存档文件的一些信息。 它向您显示存档中文件的压缩和未压缩大小、压缩率和文件名。

 gzip -l 级别1.tar.gz
 gzip -l 文本文件.txt.gz 

使用 -l list 选项查看存档的压缩统计信息

您可以使用-t (测试)选项检查存档文件的完整性。

 gzip -t level1.tar.gz 

使用 -t 选项测试存档

如果一切顺利,您将静默返回命令行。 没有消息就是好消息。

如果存档损坏或不是存档,您会被告知。

 gzip -t not-an-archive.gz 

使用 -t 选项测试不是存档的文件

速度与压缩

您可以选择优先考虑存档的创建速度或压缩程度。 为此,您可以提供一个数字作为选项,从-1到 top -9-1选项以牺牲压缩为代价提供最快的速度, -9以牺牲速度为代价提供最高的压缩。

除非您提供这些选项之一,否则 gzip 使用-6

 gzip -1 计算表.ods
 ls -lh 计算表.ods.gz
 gzip -9 计算表.ods
 ls -lh 计算表.ods.gz
 gzip -6 计算表.ods
 ls -lh 计算表.ods.gz 

使用具有不同优先级的 gzip 来提高速度和压缩率

对于这么小的文件,我们没有看到执行速度有任何显着差异,但压缩有很小的差异。

有趣的是,使用 9 级压缩和 6 级压缩没有区别。 您只能对任何给定文件进行如此多的压缩,在这种情况下,使用 6 级压缩已达到该限制。 将其提升到 9 不会进一步减小文件大小。 对于更大的文件,6 级和 9 级之间的差异会更加明显。

已压缩,未受保护

不要将压缩误认为是加密或任何形式的保护。 压缩文件不会给它任何安全性或增强的隐私性。 任何有权访问您的文件的人都可以使用gzip对其进行解压缩。

相关:列出 Linux 上 10 个最大的文件或目录