如何从 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 文件的人将其解压缩时,所有文件都整齐地放置在他们计算机上的一个目录中。
在以下命令中,我们将归档 work
目录和所有子目录。请注意,此命令是从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
(密码)选项提供密码。 (您必须使用大写字母“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

替换丢失文件的最有效方法是让 unzip
只提取存档中不在目标目录中的任何文件。为此,请使用 -n
(永不覆盖)选项。
unzip -n source_code.zip

查看 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 终端。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts