命令行手册

Man » unzip 手册在线 - 详细的在线文档,适用于 unzip man 页面

🌍
unzip - 列出、测试并提取 ZIP 压缩文件中的文件

概要

unzip   [-Z]   [-cflptTuvz[abjnoqsCDKLMUVWX$/:^]]   file[.zip]  [file(s) ...]   [-x xfile(s) ...]
[-d exdir]

描述

unzip 将列出、测试或提取 ZIP 压缩文件中的文件,这些文件通常在 MS-DOS 系统中找到。

默认行为(不带任何选项)是从指定的 ZIP 压缩文件中提取到当前目录(及其下方的子目录)中的所有文件。一个配套程序是 zip(1),用于创建 ZIP 压缩文件;这两个程序都与 PKWARE 的 PKZIP 和 PKUNZIP(用于 MS-DOS)创建的压缩文件兼容,但在许多情况下,程序选项或默认行为有所不同。

参数

file[.zip]

ZIP 压缩文件的路径。如果文件规范是通配符,则每个匹配的文件都将按操作系统(或文件系统)确定的顺序进行处理。只能使用文件名作为通配符;路径本身不能使用。通配符表达式类似于常用 Unix shell(sh、ksh、csh)中支持的表达式,并且可以包含:

*      匹配 0 个或多个字符的序列

?      匹配 1 个字符

[...]  匹配方括号内的任何单个字符;范围由起始字符、连字符和结束字符指定。如果感叹号或插入符号 (`!` 或 `^`) 位于左方括号之后,则方括号内的字符范围将被补齐(也就是说,除了方括号内的字符之外的任何内容都将被视为匹配)。要指定一个文字左方括号,必须使用三字符序列 `[[]`。

(请确保引用操作系统可能会以其他方式解释或修改的任何字符,尤其是在 Unix 和 VMS 下。)如果没有找到匹配项,则该规范假定为文字文件名;如果这也失败,则附加 .zip 后缀。请注意,支持自解压缩的 ZIP 文件,就像任何其他 ZIP 压缩文件一样;只需明确指定 .exe 后缀(如果有)。

[file(s)]

一个可选的 ZIP 压缩文件成员列表,用空格分隔。(使用 VMSCLI 定义编译的 VMS 版本必须使用逗号分隔文件。请参阅下面的 -v 选项。)可以使用正则表达式(通配符)来匹配多个成员;请参见上方。再次,请确保引用操作系统可能会以其他方式扩展或修改的表达式。

[-x xfile(s)]

一个可选的 ZIP 压缩文件成员列表,这些成员将被排除在处理之外。由于通配符通常会匹配目录分隔符(\),因此可以使用此选项来排除任何位于子目录中的文件。例如,“unzip foo *.[ch] -x */*”将提取主目录中的所有 C 源代码文件,但不会提取任何子目录中的文件。如果没有使用 -x 选项,则 ZIP 文件中所有目录中的所有 C 源代码文件都将被提取。


[-d exdir]

一个可选的目录,用于提取文件。默认情况下,所有文件和子目录都将在当前目录中重新创建;-d 选项允许在任意目录中进行提取(始终假设用户具有写入该目录的权限)。此选项不必出现在命令行的末尾;它也可以出现在 zip 文件规范之后、紧接在 zip 文件规范之后,或者在文件和 -x 选项之间。该选项和目录可以连接在一起,中间不带任何空格,但请注意,这可能会抑制正常的 shell 行为。特别是,在 Unix C shell 中,-d ~(波浪号)会被扩展为用户的家目录的名称,但 -d~ 将被视为当前目录中的字面子目录 ~

选项

请注意,为了支持过时的硬件,unzip 的使用说明屏幕限制为 22 或 23 行,因此应将其仅视为 unzip 基本语法的提醒,而不是所有可能的标志的详尽列表。详尽列表如下:

-Z     zipinfo(1) 模式。如果命令行中的第一个选项是 `-Z`,则将剩余选项视为 zipinfo(1) 选项。请参阅相应的手册页以获取这些选项的描述。

-A     [OS/2, Unix DLL] 打印 DLL 编程接口 (API) 的扩展帮助信息。

-c     将文件提取到标准输出/屏幕 (``CRT'' )。此选项类似于 `-p` 选项,只是每个文件名的打印方式略有不同,允许使用 `-a` 选项,并且如果需要,则会自动执行 ASCII 到 EBCDIC 的转换。此选项未列在 unzip 的使用说明屏幕中。

-f     刷新现有文件,即仅提取磁盘上已存在且比磁盘副本更新的文件。默认情况下,unzip 会在覆盖之前进行查询,但可以使用 `-o` 选项来禁止这些查询。请注意,在许多操作系统下,必须正确设置 TZ(时区)环境变量,才能使 `-f` 和 `-u` 正常工作(在 Unix 上,该变量通常会自动设置)。原因有些复杂,但与 DOS 格式的文件时间和 Unix 格式的时间(始终为 GMT/UTC)之间的差异以及比较这两个时间的需求有关。一个典型的 TZ 值为 ``PST8PDT''(美国太平洋时间,并自动调整夏令时)。

-l     列出归档文件(简短格式)。将指定文件的名称、未压缩的文件大小以及修改日期和时间打印出来,并显示所有指定文件的总计。如果 UnZip 在编译时定义了 OS2_EAS,则 -l 选项还会列出存储的 OS/2 扩展属性 (EA) 和 OS/2 访问控制列表 (ACL) 的大小。
此外,还会显示 zip 文件的注释和各个文件的注释(如果有)。如果文件是从单字符大小写文件系统(例如,旧的 MS-DOS FAT 文件系统)归档的,并且指定了 -L 选项,则文件名将被转换为小写,并在文件名前面加上插入符号 (^)。

-p     将文件提取到管道(标准输出)。只有文件数据才会发送到标准输出,并且文件始终以二进制格式提取,就像它们存储时一样(不进行任何转换)。

-t     测试归档文件。此选项会将每个指定的文件的内容提取到内存中,并将解压缩后的文件与原始文件的存储 CRC(循环冗余校验,一种增强的校验和)进行比较。

-T     [大多数操作系统] 将归档文件的修改时间设置为每个归档文件中最新文件的修改时间。这与 zip 的 -go 选项相对应,但它可以用于通配符 zip 文件(例如,“unzip -T \*.zip”),并且速度更快。

-u     更新现有文件并在需要时创建新文件。此选项执行与 -f 选项相同的功能,即提取比磁盘上同名文件更新的文件(并进行询问),并且还提取那些尚不存在于磁盘上的文件。有关设置时区,请参阅上面的 -f 选项。

-v     列出归档文件(详细格式)或显示诊断版本信息。此选项已发展,现在既是选项又是修饰符。作为选项,它有两个目的:当指定 zip 文件且没有其他选项时,-v 会以详细方式列出归档文件,在基本的 -l 信息中添加压缩方法、压缩大小、压缩比和 32 位 CRC。与大多数竞争工具不同,unzip 会从压缩大小数字中删除加密条目的 12 个额外的标头字节。因此,压缩大小和压缩比数字与条目的加密状态无关,并且显示正确的压缩性能。(加密 zip 文件条目的完整压缩数据流大小由更详细的 zipinfo(1) 报告显示,请参阅单独的手册。)当未指定 zip 文件时(即,完整的命令只是“unzip -v”),则会打印出一个诊断屏幕。除了包含发布日期和版本的常规标头之外,unzip 还会列出 Info-ZIP ftp 主站点以及其他 ftp 和非 ftp 站点的列表;它所针对的目标操作系统,以及(可能)编译它的硬件、使用的编译器和版本,以及编译日期;任何可能影响程序运行的特殊编译选项(另请参见“解密”部分);以及存储在环境变量中的任何可能执行相同操作的选项(请参见“环境变量选项”部分)。作为修饰符,它可以与其他选项(例如,-t)结合使用,以生成更详细或调试输出;这尚未完全实现,但将在未来的版本中实现。

-z     仅显示归档注释。

修改器

-a     转换文本文件。通常,所有文件都会被精确地提取,就好像它们是以“二进制”文件的形式存储的一样。-a 选项会使 zip 识别为文本文件(在 zipinfo 列表中带有“t”标签,而不是“b”标签)的文件自动提取,并根据需要转换行尾、文件结束符和字符集。(例如,Unix 文件使用换行符 (LF) 作为行尾 (EOL),并且没有文件结束 (EOF) 标记;Macintosh 使用回车符 (CR) 作为 EOL;大多数 PC 操作系统使用 CR+LF 作为 EOL,并使用 Ctrl+Z 作为 EOF。此外,IBM 大型机和密歇根终端系统使用 EBCDIC 而不是更常见的 ASCII 字符集,并且 NT 支持 Unicode。)请注意,zip 对文本文件的识别并非完美;有些“文本”文件实际上可能是二进制文件,反之亦然。因此,当使用 -a 选项时,unzip 会为每个提取的文件打印“[text]”或“[binary]”,以进行视觉检查。-aa 选项会强制所有文件以文本形式提取,无论其假设的文件类型如何。在 VMS 上,请参阅 -S。

-b     [通用] 将所有文件视为二进制文件(不进行文本转换)。这是 ---a 的快捷方式。

-b     [Tandem] 强制创建文件,文件代码类型为 180(“C”),当提取 Zip 条目时,这些条目被标记为“文本”。(在 Tandem 上,-a 默认启用,请参见上述内容)。

-b     [VMS] 自动转换二进制文件(请参见上述 -a),转换为固定长度的 512 字节记录格式。将选项加倍(-bb)会强制所有文件以这种格式提取。当提取到标准输出(-c 或 -p 选项生效)时,二进制(-b)或所有(-bb)文件的默认文本记录分隔符转换将被禁用。

-B     [在编译时定义了 UNIXBACKUP] 保存每个被覆盖文件的备份副本。备份文件将获得目标文件的名称,并在末尾附加一个波浪号和可选的唯一序列号(最多 5 位数字)。每当存在另一个文件名加上波浪号的文件时,都会应用序列号。当与“覆盖所有”选项 -o 结合使用时,绝不会创建编号的备份文件。在这种情况下,所有备份文件都将命名为原始文件,并在末尾附加一个波浪号,现有的备份文件将被删除,恕不另行通知。此功能与 [emacs]({filename}../../emacs)(1) 在许多位置的默认行为类似。

示例:旧的“foo”副本将被重命名为“foo~”。

警告:用户应注意,-B 选项并不能在所有情况下都防止数据丢失。例如,当 unzip 在覆盖所有模式下运行时,在 unzip 尝试将“foo”重命名为“foo~”之前,现有的“foo~”文件将被删除。当此重命名尝试失败(因为文件锁、权限不足等)时,提取“foo~”将被取消,但旧备份文件已经丢失。类似的情况发生在编号备份文件的序列号范围用尽(99999,或 16 位系统的 65535)时。在这种情况下,带有最大序列号的备份文件将被删除,并被新的备份版本替换,恕不另行通知。

-C     使用不区分大小写的匹配来选择命令行中给出的提取选择模式中的存档条目。unzip 的理念是“你得到你所要求的”。(这也导致了 -L/-U 的改变;请参阅下面的相关选项。) 由于某些文件系统是完全区分大小写的(尤其是在 Unix 操作系统下),并且 ZIP 存档和 unzip 本身都可以在多个平台上移植,因此 unzip 的默认行为是区分大小写地匹配通配符和字面文件名。也就是说,在命令行中指定“makefile”只会匹配存档中的“makefile”,而不是“Makefile”或“MAKEFILE”(同样适用于通配符规范)。由于这与许多其他操作系统/文件系统的行为不符(例如,OS/2 HPFS,它保留混合大小写但对大小写不敏感),因此可以使用 -C 选项强制所有文件名匹配都为不区分大小写。在上面的示例中,所有这三个文件都将匹配“makefile”(或“make*”等)。-C 选项会影响普通文件列表和排除文件列表(xlist)中的文件规范。

请注意,-C 选项既不影响搜索 zip 文件,也不影响将存档条目与提取路径上的现有文件进行匹配。在区分大小写的文件系统上,unzip 绝不会尝试用“foo”覆盖文件“FOO”!

-D     跳过提取项目的恢复时间戳。通常,unzip 会尝试恢复 ZIP 存档中提供的所有提取项目的元信息(并且不要求权限或带来安全风险)。通过指定 -D,unzip 会被告知抑制从 ZIP 存档条目中显式创建的目录的时间戳恢复。此选项仅适用于支持为目录设置时间戳的端口(当前为 ATheOS、BeOS、MacOS、OS/2、Unix、VMS、Win32,对于其他 unzip 端口,-D 没有效果)。重复的选项 -DD 强制抑制所有提取条目(文件和目录)的时间戳恢复。此选项会导致所有提取条目的时间戳设置为当前时间。

在 VMS 上,此选项的默认设置为 -D,以与 BACKUP 的行为保持一致:文件时间戳将被恢复,提取的目录的时间戳将保留为当前时间。要启用目录时间戳的恢复,应指定否定选项 --D。在 VMS 上,-D 选项会禁用所有提取的 ZIP 存档项的时间戳恢复。(在这里,命令行中的单个 -D 与默认的 -D 结合使用,从而在其他系统上执行显式 -DD 所执行的操作。)

-E     [仅限 MacOS] 在还原操作期间显示 MacOS 扩展字段的内容。

-F     [仅限 Acorn] 抑制从存储的文件名中删除 NFS 文件类型扩展名。

-F     [非 Acorn 系统,支持带有嵌入逗号的长文件名,并且仅在定义了 ACORN_FTYPE_NFS 时] 将来自 Acorn RISC OS 扩展字段块的文件类型信息转换为 NFS 文件类型扩展名,并将其附加到提取的文件名中。(如果存储的文件名似乎已经附加了 NFS 文件类型扩展名,则将其替换为扩展字段中的信息。)

-i     [仅限 MacOS] 忽略存储在 MacOS 扩展字段中的文件名。相反,使用存储在条目标头通用部分中最兼容的文件名。

-j     丢弃路径。不重新创建存档的目录结构;所有文件都存储在提取目录中(默认情况下,为当前目录)。

-J     [仅限 BeOS] 丢弃文件属性。不还原文件的 BeOS 文件属性,只还原文件的数据。

-J     [仅限 MacOS] 忽略 MacOS 扩展字段。跳过所有 Macintosh 特定信息。数据分叉和资源分叉作为单独的文件还原。

-K     [仅限 AtheOS、BeOS、Unix] 保留 SUID/SGID/粘性文件属性。如果没有此标志,这些属性位将被清除,以提高安全性。

-L     将任何来自仅限大写操作系统或文件系统的文件名转换为小写。 (在 5.11 之前的版本中,这是 unzip 的默认行为;新的默认行为与旧行为相同,即使用 -U 选项,现在 -U 选项已过时,并且将在未来的版本中删除。)根据存档器的不同,在单例文件系统(VMS、旧的 MS-DOS FAT 等)下存档的文件可能会存储为全部大写的文件名;在提取到保留大小写的操作系统(如 OS/2 HPFS)或大小写敏感的系统(如 Unix)时,这可能会导致外观不佳或不方便。默认情况下,unzip 按存储的方式(除了截断、不支持的字符的转换等)列出和提取文件名;此选项会导致某些系统的所有文件名转换为小写。-LL 选项强制将每个文件名转换为小写,无论其原始文件系统如何。

-M     通过内部分页器(类似于 Unix more(1) 命令)传递所有输出。在输出一屏内容之后,unzip 会显示“--More--”提示;可以通过按 Enter(回车)键或空格键来查看下一屏内容。可以通过按“q”键以及在某些系统上按 Enter/回车键来终止 unzip。与 Unix more(1) 不同,它没有向前搜索或编辑功能。此外,unzip 无法检测长行是否在屏幕边缘换行,从而导致实际打印出两行或更多行,并且很可能会在显示之前,部分文本会从屏幕顶部滚动出来。在某些系统上,无法检测屏幕上可用的行数,在这种情况下,unzip 假定高度为 24 行。

-n     绝不覆盖现有文件。如果文件已存在,则跳过该文件的提取,无需提示。默认情况下,unzip 在提取任何已存在的文件之前会询问;用户可以选择仅覆盖当前文件、覆盖所有文件、跳过提取当前文件、跳过提取所有现有文件或重命名当前文件。

-N     [Amiga] 将文件注释提取为 Amiga 文件注释。文件注释是使用 [zip]({filename}../../zip)(1) 的 -c 选项创建的,或者使用 Amiga 版本的 [zip]({filename}../../zip)(1) 的 -N 选项创建的,该选项将文件注释存储为注释。

-o     覆盖现有文件,无需提示。这是一个危险的选项,因此请谨慎使用。 (它通常与 -f 一起使用,并且是覆盖 OS/2 下目录 EA 的唯一方法。)

-P 密码
    使用密码解密加密的 zip 文件条目(如果有)。这很不安全!许多多用户操作系统都提供了让任何用户查看其他用户的当前命令行的方法;即使在独立系统上,也始终存在窥视的风险。将纯文本密码作为自动化脚本的一部分存储在命令行中更是糟糕。尽可能使用非回显的交互式提示来输入密码。 (在安全性真正重要的场合,请使用强加密,例如 Pretty Good Privacy,而不是标准 zip 文件实用程序提供的相对较弱的加密。)

-q     以安静模式执行操作(-qq = 更安静)。通常,unzip 会打印它正在提取或测试的文件名称、提取方法、可能存储在存档中的任何文件或 zip 文件注释,以及完成每个存档后可能显示的摘要。-q[q] 选项会抑制打印一些或所有这些消息。

-s     [OS/2, NT, MS-DOS] 将文件名中的空格转换为下划线。由于所有 PC 操作系统都允许文件名中包含空格,因此 unzip 默认提取文件名,文件名中的空格保持不变(例如,“EA DATA. SF”)。但是,这可能会有些不便,因为 MS-DOS 特别不能很好地支持文件名中的空格。将空格转换为下划线可以在某些情况下消除这种不便。

-S     [VMS] 将文本文件(-a、-aa)转换为 Stream_LF 记录格式,而不是默认的文本文件、可变长度记录格式。(Stream_LF 是 VMS unzip 的默认记录格式。除非请求转换(-a、-aa 和/或 -b、-bb),或者处理 VMS 特定的条目,否则将应用它。)

`-U`     [仅在 `UNICODE_SUPPORT` 可用时] 修改或禁用 UTF-8 处理。当 `UNICODE_SUPPORT` 可用时,`-U` 选项会强制 `unzip` 将所有非 ASCII 字符从 UTF-8 编码的文件名中转义为 `"#Uxxxx"`(对于 UCS-2 字符)或 `"#Lxxxxxx"`(对于需要 3 个字节的 Unicode 代码点)。此选项主要用于调试目的,当新的 UTF-8 支持可能会破坏提取的文件名时。

`-UU` 选项允许完全禁用 UTF-8 编码文件名的识别。文件名编码的处理方式将回退到早期版本的行为。

[旧的、已弃用的用法] 如果文件是在 MS-DOS、VMS 等系统下创建的,则文件名保持大写。请参阅上面的 `-L`。

`-V`     保留 (VMS) 文件版本号。VMS 文件可以以 `file.ext;##` 格式存储版本号。默认情况下,`;##` 版本号会被删除,但此选项允许保留它们。(在文件系统将文件名限制为非常短的长度时,无论此选项如何,版本号都可能会被截断或删除。)

`-W`     [仅当编译时启用了 `WILD_STOP_AT_DIR` 选项时] 修改模式匹配例程,使 `?`(单字符通配符)和 `*`(多字符通配符)都不会匹配目录分隔符字符 `/`。(`\`\`\`\` 序列充当包含目录分隔符的匹配字符的多字符通配符。) 例如:

`"*.c"` 匹配 `foo.c`,但不匹配 `mydir/foo.c`
`"**.c"` 匹配 `foo.c` 和 `mydir/foo.c`
`"*/*.c"` 匹配 `bar/foo.c`,但不匹配 `baz/bar/foo.c`
`"??*/*"` 匹配 `ab/foo` 和 `abc/foo`,但不匹配 `a/foo` 或 `a/b/foo`

这种修改后的行为等同于 UnZip 支持的一些目标操作系统的 shell 中使用的模式匹配风格(一个例子是 Acorn RISC OS)。此选项可能在 Zip 存档的内部目录分隔符字符 `/` 在原生操作系统文件名中被允许作为常规字符的系统上不可用。(当前,UnZip 对通配符 zip 文件规范和 zip 条目选择模式使用相同的模式匹配规则。对于允许 `\`\`\`\` 作为常规文件名字符的系统,`-W` 选项对通配符 zip 文件规范的作用可能不如预期。)

`-X`     [VMS、Unix、OS/2、NT、Tandem] 恢复所有者/保护信息(VMS 下的 UIC 和 ACL 条目,或 Unix 下的用户和组信息(UID/GID),或某些启用网络的 OS/2 版本(Warp Server with IBM LAN Server/Requester 3.0 to 0 Warp Connect with IBM Peer 1.0)下的访问控制列表 (ACL),或 Windows NT 下的安全 ACL)。在大多数情况下,这需要特殊的系统权限,并且在 NT 下,通过将选项加倍(`-XX`)来指示 `unzip` 使用提取的权限;但在 Unix 下,例如,属于多个组的用户可以恢复属于其中任何一个组的文件,只要用户 ID 匹配。请注意,常规文件属性始终会被恢复——此选项仅适用于某些操作系统上可用的可选的、额外的所有权信息。[NT 的访问控制列表似乎与 OS/2 的访问控制列表不兼容,因此不会尝试跨平台移植访问权限。尚不清楚在什么情况下这可能有用。

-Y     [VMS] 将存档文件名结尾的 ``.nnn''(其中 ``nnn'' 是一个十进制数字)视为
VMS 版本号 ``;nnn''。 (默认情况下,它们被视为文件类型。) 示例:
"a.b.3" -> "a.b;3"。

-$     [MS-DOS, OS/2, NT] 如果提取介质是可移动介质(例如软盘),则恢复卷标。 将选项加倍(-$$)允许标记固定介质(硬盘)。 默认情况下,卷标将被忽略。

-/ extensions
[Acorn only] 覆盖由 Unzip$Ext 环境变量提供的扩展名列表。 在提取期间,文件名扩展名与此扩展名列表中的项目匹配,则会将该扩展名交换到提取文件的基本名前面。

-:     [所有系统,但 Acorn、VM/CMS、MVS、Tandem 除外] 允许将存档成员提取到“当前提取根文件夹”之外的位置。 出于安全原因,unzip 通常会删除提取的文件名中的“父目录”路径组件(“../”)。 此安全功能(版本 5.50 的新功能)可防止 unzip 意外地将文件写入“敏感”区域,即位于活动提取文件夹树之外的区域。 -: 选项允许 unzip 切换回其以前的、更宽松的行为,以允许精确提取(较旧的)存档,这些存档使用“../”组件来在当前提取文件夹级别创建多个目录树。 此选项不允许直接写入根目录(“/”)。 要实现此目的,必须将提取目标文件夹设置为根目录(例如,-d /)。 但是,如果指定了 -: 选项,仍然可以通过在 zip 存档中指定足够的“../”路径组件来隐式写入根目录。 使用此选项时,请务必小心。

-^     [仅限 Unix] 允许控制提取的 ZIP 存档条目中的名称中的控制字符。 在 Unix 上,文件名可以包含任何(8 位)字符代码,但有两个例外:斜杠(/)(目录分隔符)和 NUL(0x00,C 字符串终止符),除非特定的文件系统具有更严格的约定。 通常,这允许在文件名中嵌入 ASCII 控制字符(甚至复杂的控制序列),至少在“本机”Unix 文件系统上。 但是,使用此 Unix“功能”可能会非常可疑。 嵌入到文件名中的控制字符可能会在某些列表代码中显示在屏幕上时产生不良副作用,因为这些代码没有进行足够的过滤。 并且,对于普通用户来说,处理这些文件名可能很困难(例如,在尝试将其指定为打开、复制、移动或删除操作时)。 因此,unzip 默认应用一个过滤器,以删除提取的文件名中可能存在的危险控制字符。 -^ 选项允许覆盖此过滤器,以防需要有意恢复文件名中的嵌入控制字符。

-2     [VMS]  强制将文件名无条件转换为与 ODS2 兼容的名称。默认情况下,它会利用目标文件系统,在 ODS5 目标文件系统上保留大小写和扩展文件名字符;并在 ODS2 目标文件系统上应用 ODS2 兼容文件名过滤。

环境选项

unzip 的默认行为可以通过放置在环境变量中的选项进行修改。这可以对任何选项进行操作,但对于 -a、-L、-C、-q、-o 或 -n 修改器来说,这可能最有用:使 unzip 默认自动转换文本文件,使其默认将文件名从大写系统转换为小写,使其默认进行大小写不敏感的名称匹配,使其默认更加安静,或者使其默认始终覆盖或从不覆盖文件。例如,要使 unzip 尽可能安静地运行,仅报告错误,可以使用以下命令:

Unix Bourne shell: UNZIP=-qq; export UNZIP

Unix C shell: setenv UNZIP -qq

OS/2 或 MS-DOS:
set UNZIP=-qq

VMS(使用引号表示小写):
define UNZIP_OPTS "-qq"

环境变量选项实际上就像任何其他命令行选项一样,只不过它们是命令行中的第一个选项。要覆盖环境变量选项,可以使用“减号运算符”将其删除。例如,要覆盖上述示例中的一个安静标志,请使用以下命令:

unzip --q[其他选项] zipfile

第一个连字符是正常的开关字符,第二个是减号,它作用于 q 选项。因此,这里的效果是取消一个安静级别的设置。要取消两个安静标志,可以使用两个(或更多)减号:

unzip -t--q zipfile
unzip ---qt zipfile

(这两者是等效的)。这可能看起来很笨拙或令人困惑,但它相当直观:只需忽略第一个连字符,然后继续。它也与 Unix nice(1) 的行为一致。

如上面的示例所示,默认变量名称对于 VMS 来说是 UNZIP_OPTS(如果使用该符号将 unzip 安装为外部命令,否则它会与环境变量混淆),对于所有其他操作系统,则是 UNZIP。为了与 zip(1) 兼容,UNZIPOPT 也可以接受(不要问)。但是,如果同时定义了 UNZIP 和 UNZIPOPT,则 UNZIP 优先。unzip 的诊断选项(不带 zip 文件名的 -v)可用于检查所有四个可能的 unzip 和 zipinfo 环境变量的值。


为了使 -f 和 -u 选项正常工作,应将时区变量 (TZ) 设置为本地时区。有关详细信息,请参见上面 -f 选项的描述。此变量对于正确设置提取文件的的时间戳也可能是必需的。WIN32(Win9x/ME/NT4/2K/XP/2K3)版本的 unzip 从注册表中获取时区配置,假设它已在控制面板中正确设置。对于此版本,TZ 变量将被忽略。

解密

Info-ZIP 软件完全支持加密存档,但由于美国的出口限制,您的编译二进制文件中可能禁用了解/加密支持。但是,自 2000 年春季以来,美国的出口限制已经解除,我们的源代码存档现在包含完整的加密代码。如果您需要启用加密支持的二进制发行版,请参阅任何 Info-ZIP 源代码或二进制发行版中的“WHERE”文件,以查找美国境内和境外的位置。

某些已编译的 unzip 版本可能不支持解密。要检查版本是否支持加密,请尝试测试或提取加密存档,或者检查 unzip 的诊断屏幕(请参见上面的 -v 选项),以查看“[decryption]”是否是特殊编译选项之一。

如上所述,可以使用 -P 选项在命令行中提供密码,但安全性会降低。首选的解密方法是正常提取;如果 zip 文件成员已加密,unzip 将提示输入密码,而不会回显所输入的内容。只要密码看起来有效,unzip 就会继续使用相同的密码,方法是对每个文件测试 12 字节的标头。正确的密码始终会针对标头进行验证,但有 1/256 的几率,错误的密码也可能会通过。这是 PKWARE zip 文件格式中的一项安全功能;它可以防止蛮力攻击,这些攻击可能会通过仅测试标头来获得更大的速度优势。如果给定的密码不正确但仍然通过标头测试,则提取数据的 CRC 将会生成不正确的校验和,或者 unzip 在提取过程中会失败,因为“解密”后的字节不构成有效的压缩数据流。

如果第一个密码在某个文件的标头测试中失败,unzip 将提示输入另一个密码,依此类推,直到提取所有文件。如果不知道密码,输入空密码(即,仅回车或“Enter”)将被视为停止所有后续提示的信号。之后,只有存档中未加密的文件将被提取。(实际上,情况并非完全如此;旧版本的 zip(1) 和 zipcloak(1) 允许使用空密码,因此 unzip 会检查每个加密文件以查看空密码是否有效。这可能会导致“假阳性”和提取错误,如上所述。)


使用 8 位密码(例如,带有重音符号的欧洲字符的密码)加密的存档可能无法在不同系统和/或不同的归档程序之间移植。 这个问题源于对这些字符使用多种编码方法,包括 Latin-1(ISO 8859-1)和 OEM 代码页 850。 DOS PKZIP 2.04g 使用 OEM 代码页;Windows PKZIP 2.50 使用 Latin-1(因此与 DOS PKZIP 不兼容);Info-ZIP 在 DOS、OS/2 和 Win3.x 端口上使用 OEM 代码页,但在其他所有地方都使用 ISO 编码(Latin-1 等);Nico Mak 的 WinZip 6.x 根本不允许使用 8 位密码。 UnZip 5.3(或更高版本)尝试首先使用默认字符集(例如,Latin-1),然后使用备用字符集(例如,OEM 代码页)来测试密码。 在 EBCDIC 系统上,如果这两种方法都失败,则 EBCDIC 编码将作为最后的尝试。 (EBCDIC 不会在非 EBCDIC 系统上进行测试,因为没有已知的归档程序使用 EBCDIC 编码进行加密。)不支持除 Latin-1 之外的其他 ISO 字符编码。 UnZip 6.0 中新添加的(部分)Unicode(即 UTF-8)支持尚未应用于 unzip 中的加密密码处理。 在使用 UTF-8 作为本机字符编码的系统上,unzip 简单地尝试使用本机 UTF-8 编码的密码进行解密;内置的尝试以翻译后的编码检查密码尚未针对 UTF-8 支持进行调整,因此将无法正常工作。

示例

要使用 unzip 提取存档 letters.zip 中的所有成员到当前目录及其子目录中,并根据需要创建任何子目录:

unzip letters

要将 letters.zip 中的所有成员提取到当前目录中:

unzip -j letters

要测试 letters.zip,仅打印一条摘要消息,指示存档是否正常:

unzip -tq letters

要测试当前目录中的所有 zip 文件,并仅打印摘要:

unzip -tq \*.zip

(如果 shell 扩展通配符,则反斜杠后面的星号是必需的,如在 Unix 中;可以使用双引号代替,如在下面的示例中。)要将 letters.zip 中所有名称以 .tex 结尾的成员提取到标准输出,自动转换为本地行尾约定,并将输出通过管道传输到 more(1):

unzip -ca letters \*.tex | more

要将二进制文件 paper1.dvi 提取到标准输出并将其管道传输到打印程序:

unzip -p articles paper1.dvi | dvips

要将所有 FORTRAN 和 C 源代码文件——*.f*.c*.hMakefile——提取到 /tmp 目录:

unzip source.zip "*.[fch]" Makefile -d /tmp

(双引号仅在 Unix 中且仅在启用通配符时才需要)。要提取所有 FORTRAN 和 C 源代码文件,无论大小写如何(例如,`*.c` 和 `*.C`,以及任何 `makefile`、`Makefile`、`MAKEFILE` 或类似的名称):

unzip -C source.zip "*.[fch]" makefile -d /tmp

要提取任何此类文件,但将任何大写 MS-DOS 或 VMS 名称转换为小写,并将所有文件的行尾转换为本地标准(不考虑任何可能被标记为“二进制”的文件):

unzip -aaCL source.zip "*.[fch]" makefile -d /tmp

要提取当前目录中较新的文件版本,而不进行查询(注意:请小心在与创建 zip 文件的时间不同的时区中解压缩——除了由 Zip 2.1 或更高版本创建的 zip 文件之外,其他 zip 文件不包含时区信息,并且来自东部时区的新文件实际上可能更旧):

unzip -fo sources

要提取当前目录中较新的文件版本,并创建任何不存在的文件(与上一个示例相同的注意事项):

unzip -uo sources

要显示一个诊断屏幕,显示哪些 unzipzipinfo 选项存储在环境变量中、是否编译了解密支持、用于编译 unzip 的编译器等:

unzip -v

在上述五个示例中,假设 UNZIPUNZIP_OPTS 设置为 -q。要执行单次静默列表:

unzip -l file.zip

要执行双次静默列表:

unzip -ql file.zip

(请注意,“`.zip`”通常不是必需的)。要执行标准列表:

unzip --ql file.zip
或
unzip -l-q file.zip
或
unzip -l--q file.zip
(选项中的额外减号不会造成问题)。

提示

当前的维护者,天性懒惰,发现定义一对别名非常有用:tt 用于 unzip -tqii 用于 unzip -Z(或 zipinfo)。然后,人们可以简单地键入 tt zipfile 来测试存档,这值得养成习惯。如果一切顺利,unzip 会报告“未检测到 zipfile.zip 中压缩数据中的错误”,此时人们就可以松一口气了。

维护者还发现将环境变量 UNZIP 设置为 -aL 非常有用,并且倾向于添加 -C。他的 ZIPINFO 变量设置为 -z

诊断

退出状态(或错误级别)近似于 PKWARE 定义的退出代码,并且在 VMS 之外采用以下值:

0     正常;未检测到任何错误或警告。

1     遇到一个或多个警告错误,但处理仍然成功完成。这包括 zip 文件,其中一个或多个文件由于不支持的压缩方法或使用未知密码进行加密而被跳过。

2     zip 文件格式中检测到一个通用错误。处理可能已成功完成;一些由其他压缩软件创建的损坏的 zip 文件具有简单的解决方法。

3     检测到 zip 文件格式中的严重错误。处理可能立即失败。

4     unzip 无法在程序初始化期间为一个或多个缓冲区分配内存。

5     unzip 无法分配内存或无法获取 tty 以读取解密密码。

6     unzip 无法在解压缩到磁盘期间分配内存。

7     unzip 无法在内存中解压缩期间分配内存。

8     [当前未使用]

9     未找到指定的 zip 文件。

10    命令行中指定了无效的选项。

11    未找到匹配的文件。

50    在提取过程中,磁盘已满(或曾经满过)。

51    过早地遇到了 ZIP 存档的末尾。

80    用户过早地使用 Control-C(或类似方式)中止了 unzip。

81    由于不支持的压缩方法或不支持的解密,一个或多个文件的测试或提取失败。

82    由于错误的解密密码,未找到任何文件。(但是,如果即使有一个文件已成功处理,则退出状态为 1。)

VMS 将标准的 Unix(或 PC)返回值解释为其他、更可怕的事物,因此 unzip 相反地将它们映射到 VMS 样式的状态代码。当前的映射如下:正常退出时为 1(成功),对于警告错误为 0x7fff0001,对于所有其他错误,为 (0x7fff000? + 16*normal_unzip_exit_status),其中 `?` 对于 unzip 值 2、9-11 和 80-82 为 2(错误),对于其余值(3-8、50、51)为 4(严重错误)。此外,还有一个编译选项可以扩展此行为:定义 RETURN_CODES 会生成对错误状态的含义的人类可读的解释。

错误

多部分存档目前不支持,除非与 zip 结合使用。(所有部分必须按顺序连接在一起,然后必须对连接的存档执行“zip -F”(对于 zip 2.x)或“zip -FF”(对于 zip 3.x),以“修复”它。此外,zip 3.0 及更高版本可以使用“zip -s- inarchive -O outarchive”将多部分(分割)存档组合成单个文件存档。有关更多信息,请参阅 zip 3 手册页。)。这肯定会在下一个主要版本中得到修正。

从标准输入读取的存档目前不支持,除了使用 funzip(并且仅可以提取存档的第一个成员)。

使用 8 位密码(例如,带有重音符号的欧洲字符的密码)加密的存档可能无法在系统和/或其他压缩软件之间移植。请参阅上面的“解密”部分中的讨论。

unzip 的 -M(``more`) 选项试图考虑到长行自动换行。但是,代码可能无法检测到正确的换行位置。首先,制表符字符(以及类似的控制序列)未被考虑在内,它们被视为普通的印刷字符。其次,根据实际的系统/操作系统移植,unzip 可能无法检测到真实的屏幕几何形状,而是依赖于“常用”的默认尺寸。正确处理制表符需要实现一个查询,以确定输出控制台上实际的制表符设置。


除非在 Unix 系统下,否则不会恢复存储目录的日期、时间和权限。(在 Windows NT 及后续版本中,时间戳现在已恢复。)

[MS-DOS] 当从有缺陷的软盘中提取或测试压缩包中的文件时,如果从 DOS 的“Abort, Retry, Fail?”消息中选择“Fail”选项,旧版本的 unzip 可能会导致系统崩溃,需要重新启动。 此问题似乎已修复,但仍然可以使用 Ctrl-C(或 Ctrl-Break)来终止 unzip。

在 DEC Ultrix 上,unzip 有时会在处理大型压缩包时失败(CRC 错误,并非总是可重现)。 这显然是由于硬件错误(缓存内存)或操作系统错误(对页面错误的错误处理)引起的。 由于 Ultrix 已被 Digital Unix (OSF/1) 取代,因此这可能不再是一个问题。

[Unix] 即使压缩包中包含 Unix 特殊文件(如 FIFO 缓冲区(命名管道)、块设备和字符设备),也不会恢复它们,并且也不会重新链接硬链接文件。 基本上,unzip 恢复的文件类型仅限于常规文件、目录和符号(软)链接。

[OS/2] 现有目录的扩展属性仅在给出 -o(“覆盖所有”)选项时才会更新。 这是操作系统的限制;由于目录仅具有与之关联的创建时间,因此 unzip 无法确定存储的属性是更新还是较旧,从而确定是否应该更新。 在实践中,这可能意味着需要采用两步方法:首先以正常方式解压缩存档(无论是否刷新/更新现有文件),然后仅覆盖目录条目(例如,“unzip -o foo */”)。

[VMS] 在提取到另一个目录时,仅接受 [.foo] 语法作为 -d 选项;简单的 Unix foo 语法将被忽略(不太常见的 VMS foo.dir 语法也是如此)。

[VMS] 当要提取的文件已存在时,unzip 的查询仅允许跳过、覆盖或重命名;还应提供一个选择来创建文件的新的版本。 实际上,“覆盖”选项确实会创建一个新的版本;旧版本不会被覆盖或删除。

参见

funzip(1), zip(1), zipcloak(1), zipgrep(1), zipinfo(1), zipnote(1), zipsplit(1)

URL

Info-ZIP 主页位于 http://www.info-zip.org/pub/infozip/ 或 ftp://ftp.info-zip.org/pub/infozip/ 。


作者

Info-ZIP 的主要作者(当前 Zip-Bugs 工作组的活跃成员)包括:Ed Gordon(Zip,通用维护,共享代码,Zip64,Win32,Unix,Unicode);Christian Spieler(UnZip 维护协调,VMS,MS-DOS,Win32,共享代码,通用 Zip 和 UnZip 集成和优化);Onno van der Linden(Zip);Mike White(Win32,Windows GUI,Windows DLL);Kai Uwe Rommel(OS/2,Win32);Steven M. Schweda(VMS,Unix,支持新功能);Paul Kienitz(Amiga,Win32,Unicode);Chris Herborth(BeOS,QNX,Atari);Jonathan Hudson(SMS/QDOS);Sergio Monesi(Acorn RISC OS);Harald Denker(Atari,MVS);John Bush(Solaris,Amiga);Hunter Goatley(VMS,Info-ZIP 站点维护);Steve Salisbury(Win32);Steve Miller(Windows CE GUI),Johnny Lee(MS-DOS,Win32,Zip64);以及 Dave Smith(Tandem NSK)。

以下人员曾是 Info-ZIP 开发组的成员,并为当前代码的关键部分做出了重大贡献:Greg “Cave Newt” Roelofs(UnZip,unshrink 解压缩);Jean-loup Gailly(deflate 压缩);Mark Adler(inflate 解压缩,fUnZip)。

原始 unzip 代码的作者是 Samuel H. Smith;Carl Mascott 进行了第一个 Unix 移植;David P. Kirschbaum 在早期组织并领导了 Info-ZIP,Keith Petersen 在 WSMR-SimTel20 上托管了原始邮件列表。UnZip 的完整贡献者列表已经变得相当庞大;请参阅 UnZip 源代码发行版中的 CONTRIBS 文件,以获取相对完整的版本。

版本

v1.2   15 Mar 89   Samuel H. Smith
v2.0    9 Sep 89   Samuel H. Smith
v2.x   fall 1989   many Usenet contributors
v3.0    1 May 90   Info-ZIP (DPK, consolidator)
v3.1   15 Aug 90   Info-ZIP (DPK, consolidator)
v4.0    1 Dec 90   Info-ZIP (GRR, maintainer)
v4.1   12 May 91   Info-ZIP
v4.2   20 Mar 92   Info-ZIP (Zip-Bugs subgroup, GRR)
v5.0   21 Aug 92   Info-ZIP (Zip-Bugs subgroup, GRR)
v5.01  15 Jan 93   Info-ZIP (Zip-Bugs subgroup, GRR)
v5.1    7 Feb 94   Info-ZIP (Zip-Bugs subgroup, GRR)
v5.11   2 Aug 94   Info-ZIP (Zip-Bugs subgroup, GRR)
v5.12  28 Aug 94   Info-ZIP (Zip-Bugs subgroup, GRR)
v5.2   30 Apr 96   Info-ZIP (Zip-Bugs subgroup, GRR)
v5.3   22 Apr 97   Info-ZIP (Zip-Bugs subgroup, GRR)
v5.31  31 May 97   Info-ZIP (Zip-Bugs subgroup, GRR)
v5.32   3 Nov 97   Info-ZIP (Zip-Bugs subgroup, GRR)
v5.4   28 Nov 98   Info-ZIP (Zip-Bugs subgroup, SPC)
v5.41  16 Apr 00   Info-ZIP (Zip-Bugs subgroup, SPC)
v5.42  14 Jan 01   Info-ZIP (Zip-Bugs subgroup, SPC)
v5.5   17 Feb 02   Info-ZIP (Zip-Bugs subgroup, SPC)
v5.51  22 May 04   Info-ZIP (Zip-Bugs subgroup, SPC)
v5.52  28 Feb 05   Info-ZIP (Zip-Bugs subgroup, SPC)
v6.0   20 Apr 09   Info-ZIP (Zip-Bugs subgroup, SPC)