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

ZIP 文件是一种在 Windows、macOS 和 Linux 系统中广泛使用的通用归档格式。在 Linux 中,您可以使用一些常用的终端命令来创建和解压缩 ZIP 文件。

ZIP 压缩存档文件格式

由于 ZIP 格式在 Windows 系统中的普及,它可能成为全球最常用的压缩归档方式。尽管 .tar.gz 和 .tar.bz2 文件在 Linux 环境中很常见,但 Windows 用户可能会发送 ZIP 格式的归档文件。而且,如果你需要向 Windows 用户发送压缩文件,ZIP 格式将是最简单和兼容性最佳的选择。

zip、unzip 及其他相关工具

Linux 和类 Unix 操作系统(例如 macOS)自带工具,名为 `zip` 和 `unzip`,用于创建和提取 ZIP 文件。此外,还有一系列相关的实用程序,如 `zipcloak`、`zipdetails`、`zipsplit` 和 `zipinfo`,它们提供了更高级的功能。

经过对一些 Linux 发行版的调查,发现 Ubuntu 19.04、18.10 和 18.04 以及 Manjaro 18.04 默认都包含了这些实用工具。然而,Fedora 29 和 CentOS 仅预装了 `zip` 和 `unzip`。

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

sudo dnf install perl-IO-Compress

要在 CentOS 7 上安装缺少的工具,请执行以下操作:

sudo yum install perl-IO-Compress

如果你的 Linux 发行版缺少任何 zip 工具,请使用该发行版的包管理器安装必要的软件包。

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

要创建 ZIP 文件,你需要指定归档文件的名称以及要包含的文件。虽然不需要在归档名称中添加 `.zip` 扩展名,但建议这样做以增加清晰度。

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

zip source_code *.c *.h

每个添加到归档中的文件都会被列出,并显示其名称和压缩量。

当你查看新创建的 ZIP 归档文件时,会发现 `.zip` 文件扩展名已自动添加。

ls -l source_code.zip

如果你不想在创建 ZIP 文件时看到 zip 的输出信息,可以使用 `-q`(安静)选项。

zip -q source_code *.c *.h

在 ZIP 文件中包含目录

要在 ZIP 文件中包含子目录,请使用 `-r`(递归)选项,并在命令行中加入子目录的名称。例如,要创建一个 ZIP 文件,其中包含 `archive` 子目录及其中的所有内容,可以使用以下命令:

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

考虑到接收 ZIP 文件的人,通常最好创建一个 ZIP 文件,并将所有文件包含在一个目录中。这样,当他们解压缩文件时,所有内容都会整齐地放入他们计算机上的一个文件夹中。

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

zip -r -q source_code work/

设置压缩级别

您可以在添加文件到 ZIP 归档时设置不同的压缩级别。压缩级别范围从 0 到 9,其中 0 表示完全不压缩。压缩级别越高,创建 ZIP 文件所需的时间越长。对于中等大小的 ZIP 文件,时间上的差异通常可以忽略不计。对于大多数情况,默认压缩级别(6)已经足够。

要设置特定的压缩级别,请在命令行中使用带有 `-` 的数字选项,例如:

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` 命令会要求你输入密码。如果未提供正确的密码,将无法提取文件。

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 文件解压缩到与以前相同的目录,`unzip` 命令会提示你做出关于是否覆盖文件的决定。你需要输入以下响应之一。

除了 `r`(重命名)响应之外,这些响应都是大小写敏感的。

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

要强制 `unzip` 命令覆盖任何现有文件,可以使用 `-o`(覆盖)选项。

unzip -o -q source_code.zip

替换丢失文件的最有效方法是仅提取归档中目标目录中不存在的任何文件。要做到这一点,请使用 `-n`(从不覆盖)选项。

unzip -n source_code.zip

查看 ZIP 文件

在解压缩之前查看 ZIP 文件中的文件列表通常很有用。你可以使用 `-l`(列表存档)选项执行此操作。为了便于管理输出,通常会将其通过管道传递给 `less`。

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 文件中任何文件的大小。

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