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

时间:2020-01-09 10:39:58  来源:igfitidea点击:

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

ZIP压缩存档文件格式

由于Windows领域中ZIP格式的优势,ZIP文件可能是世界上最常见的压缩存档形式。

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

zip,unzip和其他实用程序

我们可能已经知道,像macOS这样的Linux和类似Unix的操作系统具有允许我们创建ZIP文件并从中提取文件的工具,称为zipunzip。但是有一整套相关的实用程序,例如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文件的人将其提取后,所有文件都会整齐地放置在其计算机上的目录中。

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

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会要求我们输入密码。如果我们没有提供正确的密码,unzip将不会解压缩文件。

unzip -q source_code.zip

如果我们不希望别人看到密码,也不必担心密码是否存储在命令历史记录中,则可以在命令行上使用`-P'(password)选项提供密码。 (我们必须使用大写字母P。)

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

排除文件

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

unzip -q source_code.zip -x *.h

覆盖文件

假设我们已提取档案,但是误删除了一些提取的文件。

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

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

  • y:是,覆盖此文件

  • n:否,请勿覆盖此文件

  • 答:全部,覆盖所有文件

  • N:无,不覆盖任何文件

  • r:重命名,解压缩此文件,但重新命名。系统将提示我们输入一个新名称。

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

unzip -o -q source_code.zip

替换丢失文件的最有效方法是使unzip仅提取存档中未位于目标目录中的所有文件。为此,请使用-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文件中任何文件的大小。

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