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

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

ZIP压缩存档文件格式

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

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

相关:如何在Linux上从.tar.gz或.tar.bz2文件中提取文件

压缩、解压缩和其他实用程序

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

我们检查了一些Linux发行版,看看它们在标准安装中是否包含这些实用程序。所有实用程序都出现在Ubuntu 19.04、18.10和18.04中。他们也出现在Manjaro 18.04。Feddora29包括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选项,但如果提供-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文件解压到与之前相同的目录中,unzip将提示您决定是否覆盖这些文件。它预计会有以下回应之一。

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

Y:是,覆盖此文件。 N:不,不要覆盖此文件。 A:全部,覆盖所有文件。 N:无,不覆盖任何文件。 R:重命名,解压缩此文件,但给它一个新名称。系统将提示您输入新名称。

要强制解压缩覆盖任何现有文件,请使用-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文件的大量信息。处理此命令可以提供的输出量的唯一明智方法是通过较少的管道传输它。

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:如果有一个扩展的本地报头,并且有一个额外的字段

使用zipplit命令拆分文件

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

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

zipsplit -n 102400 source_code.zip

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

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

相关文章