在 Linux 中使用 Zip 命令


概述

zip 命令是任何操作系统上最实用的工具之一。它允许您将多个文件压缩到单个压缩归档文件中。然后,您可以使用 unzip 命令解压缩该归档文件。本教程将向您展示如何使用 zip 命令创建和提取归档文件。

在本教程中,我们将了解 Linux 中的 zip 命令行工具。我们将学习如何使用它创建和提取归档文件。zip 命令是 GNU core utils 软件包的一部分。它可以用于创建和提取归档文件中的文件。

基本用法

zip(或 x)命令最基本用途之一是将文件压缩到归档文件中。例如,我们可以通过键入以下命令将两个文本文档压缩到名为 important-backup.tar.gz 的归档文件中:

$ zip important-backup.zip credentials.txt statement.txt
adding: credentials.txt (stored 0%)
adding: statement.txt (stored 0%)

在不解压缩的情况下列出归档文件内容

有时我们只需要查看归档文件的内容,而无需提取它们。为此,可以使用 zipinfo 命令和解压缩命令,这两个命令都是 zip 包的一部分。

如果要查看名为“archive.zip”的归档文件的内容,可以使用命令行工具 zipinfo 来实现:

$ zipinfo important-backup.zip
Archive: important-backup.zip
Zip file size: 347 bytes, number of entries: 2
-rw-r--r-- 3.0 unx 8 tx stor 21-May-03 11:22 credentials.txt
-rw-r--r-- 3.0 unx 5 tx stor 21-May-03 11:22 statement.txt
2 files, 13 bytes uncompressed, 13 bytes compressed: 0.0%

我们可以使用 unzip 命令直接列出归档文件的内容。

$ unzip -l important-backup.zip
Archive: important-backup.zip
Length Date Time Name
--------- ---------- ----- ----
8 2021-05-03 11:22 credentials.txt
5 2021-05-03 11:22 statement.txt
--------- -------
13 2 files

使用 -l 选项,tar 程序不会实际提取归档文件,而只是显示其内容。

在不解压缩的情况下从归档文件中删除文件

如果要从归档备份中删除一些文件而不提取它们,请对 zip 命令使用 -d 选项。例如,如果要删除 important-backup 文件夹中的 statement.txt 文件,请运行以下命令:

$ zip -d important-backup.zip statement.txt
deleting: statement.txt

让我们看看命令返回后归档文件 important-backups.zip 中的内容。

$ zipinfo important-backup.zip
Archive: important-backup.zip
Zip file size: 188 bytes, number of entries: 1
-rw-r--r-- 3.0 unx 8 tx stor 21-May-03 11:22 credentials.txt
1 file, 8 bytes uncompressed, 8 bytes compressed: 0.0%

我们可以看到 statement.txt 已从 zip 文件中删除,而无需首先解压缩其内容。

加密归档文件

zip 命令提供 -e 标志来加密归档文件,并要求输入密码,该密码用作生成的加密归档文件的加密密钥。

让我们创建并加密一个名为 encrypted-backup.zip 的归档文件:

$ zip -e encrypted-backup.zip bank-accounts.txt credentials.txt
Enter password:
Verify password:
adding: bank-accounts.txt (stored 0%)
adding: credentials.txt (stored 0%)

通过调用 -e 标志,此命令将提示我们输入一个密码,该密码将用于加密数据。

如果我们现在尝试解压缩归档文件,它将要求输入密码才能解压缩:

$ unzip encrypted-backup.zip
Archive: encrypted-backup.zip
[encrypted-backup.zip] bank-accounts.txt password:

但是,我们仍然可以使用 zipinfo 和 unzip 等工具列出加密归档文件的内容,而无需知道密码:

$ zipinfo encrypted-backup.zip
Archive: encrypted-backup.zip
Length Date Time Name
--------- ---------- ----- ----
17 2021-05-03 11:49 bank-accounts.txt
8 2021-05-03 11:22 credentials.txt
--------- -------
25 2 files

如我们所见,当我们尝试读取其内容列表时,它不会提示我们输入密码。

递归遍历子目录

通常,zip 命令不会创建目录及其内容的归档文件。但是,当添加 -r 标志时,zip 会从子目录收集文件以形成单个归档文件。

例如,假设我们有一个名为 prod-secret 的目录,其中包含一些机密文件:

$ ls prod-secret
kafka-passwd.secret mongo-passwd.secret mysql-passwd.secret

要创建整个 prod-secret 目录的归档文件,我们可以使用 -r 标志运行 zip 命令:

$ zip -r prod-secret.zip prod-secret
adding: prod-secret/ (stored 0%)
adding: prod-secret/mysql-passwd.secret (stored 0%)
adding: prod-secret/mongo-passwd.secret (stored 0%)
adding: prod-secret/kafka-passwd.secret (stored 0%)

使用 -r 选项运行命令可确保目录内的文件也被包含在内。

但是,如果没有 -r 标志,zip 命令将忽略 prod-secret 目录内的文件:

$ zip prod-secret prod-secret
adding: prod-secret/ (stored 0%)

包含和排除文件模式

我们可以使用 zip 文件创建过滤器,这些过滤器将包含或排除某些文件。此外,这些过滤器通过 glob 模式识别。此外,这些过滤器可用于创建、删除或刷新。

假设我们在以下目录中工作:

$ tree -a
.
|-- .git
| |-- HEAD
| |-- branch
| `-- tag
|-- credentials.txt
|-- customer-details.txt
`-- prod-secret
|-- .git
| |-- HEAD
| `-- branch
|-- kafka-passwd.secret
|-- mongo-passwd.secret
`-- mysql-passwd.secret
 
3 directories, 10 files

当我们查看 tree 命令的输出时,我们可以看到我们的目录遵循图形结构。出现两个 .git 文件夹 - 一个在当前文件夹中,另一个在 prod-secret 中。

包含与模式匹配的文件和文件夹

我们可以使用 -i 标志创建包含过滤器。这意味着文件应遵循过滤器模式才能在使用 zip 命令时包含在内。

让我们创建一个仅包含 .git 子文件夹的归档文件 only-git.zip:

$ zip -r only-git.zip . -i *.git*
adding: prod-secret/.git/ (stored 0%)
adding: prod-secret/.git/branch (stored 0%)
adding: prod-secret/.git/HEAD (stored 0%)
adding: .git/ (stored 0%)
adding: .git/tag (stored 0%)
adding: .git/branch (stored 0%)
adding: .git/HEAD (stored 0%)

从输出中,我们可以看到 zip 命令仅归档与 glob 匹配的文件夹和文件。

排除与模式匹配的文件和文件夹

要创建排除过滤器,我们可以使用 -x 标志后跟 glob 模式。当使用 zip 时,它将忽略与排除过滤器模式匹配的文件。特别是,我们可以使用 zip -x 创建一个排除 .git 文件夹的归档文件:

$ zip -r no-git.zip . -x *.git*
adding: prod-secret/ (stored 0%)
adding: prod-secret/mysql-passwd.secret (stored 0%)
adding: prod-secret/mongo-passwd.secret (stored 0%)
adding: prod-secret/kafka-passwd.secret (stored 0%)
adding: customer-details.txt (stored 0%)
adding: credentials.txt (stored 0%)

如我们从输出中观察到的,该命令没有将任何 .git 文件夹添加到 no-git.zip 归档文件中。

Learn Linux/Unix in-depth with real-world projects through our Linux/Unix certification course. Enroll and become a certified expert to boost your career.

结论

本教程全面概述了 zip 命令行工具。

我们从基本的安装指南以及语法结构和基本用法开始。最后,我们介绍了在不解压缩的情况下检查归档文件内容的方法。

之后,我们说明了一些选择,这些选择使我们能够控制现有的归档文件。此外,我们说明了一些使用递归标志和包含和排除过滤器的设置归档文件的可能性。

更新于: 2023年1月3日

2K+ 次查看

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告