如何从 Linux 终端压缩或解压缩文件

ZIP 文件是 Windows、macOS 甚至 Linux 系统上常用的通用存档。 您可以使用一些常见的 Linux 终端命令创建一个 zip 存档或解压缩文件。

ZIP 压缩存档文件格式

由于 ZIP 格式在 Windows 领域的主导地位,ZIP 文件可能是世界上最常见的压缩存档形式。

虽然 .tar.gz 和 tar.bz2 文件在 Linux 上很常见,但 Windows 用户可能会向您发送 ZIP 格式的存档。 而且,如果您想归档一些文件并将它们发送给 Windows 用户,ZIP 格式将是对每个人来说最简单、最兼容的解决方案。

zip、unzip 和其他实用程序

您可能已经知道 Linux 和类 Unix 操作系统(例如 macOS)具有允许您创建 ZIP 文件并从中提取文件的工具,称为 zip 和 unzip。 但是有一整套相关的实用程序,例如 zipcloak、zipdetails、zipsplit 和 zipinfo。

我们检查了一些 Linux 发行版,看看它们是否在标准安装中包含了这些实用程序。 所有实用程序都存在于 Ubuntu 19.04、18.10 和 18.04 中。 他们也出现在 Manjaro 18.04。 Fedora 29 包含 zip 和 unzip,但没有其他实用程序,CentOS 也是如此。

要在 Fedora 29 上安装缺少的元素,请使用以下命令:

sudo dnf install perl-IO-Compress

要在 CentOS 7 上安装缺少的元素,请使用以下命令:

sudo yum install perl-IO-Compress

如果上面没有提到的 Linux 发行版中缺少任何 zip 实用程序,请使用该 Linux 发行版的包管理工具来安装所需的包。

如何使用 zip 命令创建 ZIP 文件

要创建 ZIP 文件,您需要告诉 zip 存档文件的名称以及要包含在其中的文件。 您不需要在存档名称中添加“.zip”扩展名,但这样做也无妨。

要创建一个名为 source_code.zip 的文件,其中包含当前目录中的所有 C 源代码文件和头文件,您可以使用以下命令:

zip source_code *.c *.h

每个文件都在添加时列出。 显示文件的名称和对该文件实现的压缩量。

如果您查看新的 ZIP 存档,您会看到“.zip”文件扩展名已由 zip 自动添加。

ls -l source_code.zip

如果您不想在创建 ZIP 文件时看到 zip 的输出,请使用 -q(安静)选项。

zip -q source_code *.c *.h

在 ZIP 文件中包含目录

要在 ZIP 文件中包含子目录,请使用 -r(递归)选项并在命令行中包含子目录的名称。 要像以前一样创建 ZIP 文件并包含存档子目录,请使用此命令。

zip -r -q source_code archive/ *.c *.h

考虑到将要从您正在创建的 ZIP 文件中提取文件的人,创建 ZIP 文件并将其中的文件包含在目录中通常是礼貌的。 当收到 ZIP 文件的人将其解压缩时,所有文件都整齐地放置在他们计算机上的一个目录中。

在以下命令中,我们将归档工作目录和所有子目录。 请注意,此命令是从工作文件夹的父目录发出的。

zip -r -q source_code work/

设置压缩级别

您可以设置在将文件添加到 ZIP 存档时对文件应用多少压缩。 范围是从 0 到 9,其中 0 表示完全没有压缩。 压缩率越高,创建 ZIP 文件所需的时间就越长。 对于大小适中的 ZIP 文件,时间差不会造成重大损失。 但是,对于大小适中的 ZIP 文件,默认压缩(级别 6)可能已经足够好。

要让 zip 使用特定级别的压缩,请在命令行上将数字作为选项传递,并带有“-”,如下所示:

zip -0 -r -q source_code work/

默认压缩级别为 6。无需提供 -6 选项,但如果提供也无妨。

zip -r -q source_code work/

最大压缩级别为 9 级。

zip -9 -r -q source_code work/

选择此处存档的文件和目录后,无压缩(级别 0)和默认压缩(级别 6)之间的差异为 400K。 默认压缩和最高压缩级别(级别 9)之间的差异仅为 4K。

这可能看起来不多,但对于包含数百甚至数千个文件的档案,每个文件的少量额外压缩加起来可以节省空间。

将密码添加到 ZIP 文件

向 ZIP 文件添加密码很容易。 使用 -e(加密)选项,系统会提示您输入密码并重新输入以进行验证。

zip -e -r -q source_code work/

如何使用 unzip 命令解压缩 ZIP 文件

要从 ZIP 文件中提取文件,请使用 unzip 命令,并提供 ZIP 文件的名称。 请注意,您确实需要提供“.zip”扩展名。

unzip source_code.zip

提取文件后,它们将列在终端窗口中。

ZIP 文件不包含文件所有权的详细信息。 提取的所有文件都将所有者设置为提取它们的用户。

就像 zip 一样,unzip 有一个 -q(安静)选项,因此您在提取文件时不需要查看文件列表。

unzip -q source_code.zip

将文件提取到目标目录

要将文件提取到特定目录中,请使用 -d(目录)选项,并提供您希望将存档提取到的目录的路径。

unzip -q source_code.zip -d ./development

提取受密码保护的 ZIP 文件

如果已使用密码创建 ZIP 文件,解压缩将要求您输入密码。 如果您没有提供正确的密码,解压缩将不会解压缩文件。

unzip -q source_code.zip

如果您不关心其他人看到您的密码,也不关心它是否存储在您的命令历史记录中,您可以在命令行中使用 -P(密码)选项提供密码。 (您必须使用大写“P”。)

unzip -P fifty.treacle.cutlass -q source_code.zip

排除文件

如果您不想提取特定文件或文件组,请使用 -x(排除)选项。 在此示例中,我们要提取除以“.h”扩展名结尾的文件之外的所有文件。

unzip -q source_code.zip -x *.h

覆盖文件

假设您提取了一个档案,但您错误地删除了一些提取的文件。

一个快速的解决方法是再次提取文件。 但是,如果您尝试将 ZIP 文件解压缩到与以前相同的目录中,解压缩将提示您做出有关覆盖文件的决定。 它将期望以下响应之一。

除了 r(重命名)响应外,这些响应区分大小写。

y:是的,覆盖这个文件
n:不,不要覆盖这个文件
A:全部,覆盖所有文件
N:无,不覆盖任何文件
r:重命名,提取此文件,但给它一个新名称。 系统将提示您输入新名称。

要强制解压缩以覆盖任何现有文件,请使用 -o(覆盖)选项。

unzip -o -q source_code.zip

替换丢失文件的最有效方法是仅解压缩存档中不在目标目录中的任何文件。 为此,请使用 -n(从不覆盖)选项。

unzip -n source_code.zip

查看 ZIP 文件

在解压缩之前查看 ZIP 文件中的文件列表通常很有用且具有指导意义。 您可以使用 -l(列表存档)选项来执行此操作。 它通过较少的管道传输以使输出易于管理。

unzip -l source_code.zip | less

输出显示 ZIP 文件中的目录和文件、它们的长度以及它们添加到存档的时间和日期。 按“q”退出less。

正如我们将看到的,还有其他方法可以查看提供不同类型信息的 ZIP 文件。

使用 zipcloak 命令添加密码

如果您创建了 ZIP 文件但忘记添加密码,该怎么办? 您可以使用 zipcloak 命令快速将密码添加到 ZIP 文件。 在命令行中传递 ZIP 文件的名称。 系统将提示您输入密码。 您需要再次输入密码以验证密码。

zipcloak source_code.zip

使用 zipdetails 命令查看文件详细信息

zipdetails 命令将向您显示有关 ZIP 文件的大量信息。 处理此命令可以提供的输出量的唯一明智方法是将其通过管道传递 less 。

zipdetails source_code.zip | less

请注意,即使 ZIP 文件受密码保护,该信息也将包括文件名。 这种类型的信息作为元数据存储在 ZIP 文件中,而不是加密数据的一部分。

使用 zipgrep 命令在文件内部搜索

zipgrep 命令允许您在 ZIP 文件中的文件中进行搜索。 在以下示例中,我们想知道 ZIP 文件中的哪些文件中包含文本“keyval.h”。

zipgrep keyval.h source_code.zip

我们可以看到文件 slang.c 和 getval.c 包含字符串“keyval.h”。我们还可以看到,在 ZIP 文件的不同目录中,每个文件都有两个副本。

使用 zipinfo 命令查看信息

zipinfo 命令为您提供了另一种查看 ZIP 文件内部的方法。 和以前一样,我们通过 less 管道输出。

zipinfo source_code.zip | less

输出从左到右显示:

文件权限
用于创建 ZIP 文件的工具版本
原始文件大小
文件描述符(如下所述)
压缩方法(在这种情况下是放气)
数据和时间戳
文件名和任何目录

文件描述符由两个字符组成。 第一个字符是“t”或“b”,表示文本或二进制文件。 如果是大写字母,则文件被加密。 第二个字符可以是四个字符之一。 该字符表示该文件包含什么类型的元数据:无、扩展的本地标头、“额外字段”,或两者兼而有之。

-:如果都不存在,则字符将是连字符
l:如果有扩展的本地头但没有额外的字段
x:如果没有扩展的本地头但有一个额外的字段
X:如果有一个扩展的本地头并且有一个额外的字段

使用 zipsplit 命令拆分文件

如果您需要将 ZIP 文件发送给其他人,但存在大小限制或文件传输问题,您可以使用 zipsplit 命令将原始 ZIP 文件拆分为一组较小的 ZIP 文件。

-n(大小)选项允许您为每个新 ZIP 文件设置最大大小。 在此示例中,我们将拆分 source_code.zip 文件。 我们不希望任何新的 ZIP 文件大于 100 KB(102400 字节)。

zipsplit -n 102400 source_code.zip

您选择的大小不能小于 ZIP 文件中任何文件的大小。

使用这些命令,您可以创建自己的 ZIP 文件、解压缩收到的 ZIP 文件,并对它们执行各种其他操作,而无需离开 Linux 终端。