如何从Linux终端压缩或者解压缩文件
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文件并从中提取文件的工具,称为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文件的人将其提取后,所有文件都会整齐地放置在其计算机上的目录中。
在以下命令中,我们将存档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终端。