zip - 压缩(打包)文件
语法
zip [-aABcdDeEfFghjklLmoqrRSTuvVwXyz!@$] [--longoption ...] [-b path] [-n suffixes] [-t date]
[-tt date] [zipfile [file ...]] [-xi list]
zipcloak(请参阅单独的手册页)
zipnote(请参阅单独的手册页)
zipsplit(请参阅单独的手册页)
注意:zip 中的命令行处理方式已更改,以支持长选项并更一致地处理所有选项和参数。一些依赖于命令行不一致性的旧命令行可能不再有效。
描述
zip 是一种用于 Unix、VMS、MSDOS、OS/2、Windows 9x/NT/XP、Minix、Atari、Macintosh、Amiga 和 Acorn RISC OS 的压缩和文件打包工具。它类似于 Unix 命令 [tar]({filename}../../tar)(1) 和 compress(1) 的组合,并且与 PKZIP(Phil Katz 针对 MSDOS 系统的 ZIP)兼容。
配套程序(unzip(1))用于解压缩 zip 存档。zip 和 unzip(1) 程序可以处理 PKZIP(支持 PKZIP 4.6 版本之前的大部分 PKZIP 功能)生成的存档,并且 PKZIP 和 PKUNZIP 可以处理 zip 生成的存档(有一些例外情况,尤其是流式存档,但 zip 文件标准的最新更改可能会更好地提高兼容性)。zip 版本 3.0 与 PKZIP 2.04 兼容,并且还支持 PKZIP 4.5 的 Zip64 扩展,这些扩展允许存档以及文件超过之前的 2 GB 限制(在某些情况下为 4 GB)。如果编译 zip 时包含 bzip2 库,zip 现在还支持 bzip2 压缩。请注意,PKUNZIP 1.10 无法提取由 PKZIP 2.04 或 zip 3.0 生成的文件。您必须使用 PKUNZIP 2.04g 或 unzip 5.0p1(或更高版本)来提取这些文件。
请参阅页面底部的“示例”部分,了解一些 zip 的典型用法示例。
大型存档和 Zip64。当将大于 4 GB 的文件添加到存档中,更新包含 Zip64 条目的存档(如果生成的存档仍然需要 Zip64),存档的大小将超过 4 GB,或者存档中的条目数将超过大约 64K 时,zip 会自动使用 Zip64 扩展。Zip64 也用于从标准输入流式传输存档,因为此类存档的大小是未知的,但可以使用 -fz- 选项强制 zip 创建与 PKZIP 2 兼容的存档(前提是不需要 Zip64 扩展)。您必须使用与 PKZIP 4.5 兼容的 unzip,例如 unzip 6.0 或更高版本,才能提取使用 Zip64 扩展的文件。
此外,流式存档、使用标准加密加密的条目或使用暂停选项创建的分割存档可能与 PKZIP 不兼容,因为使用了数据描述符,并且 PKZIP 在撰写本文时不支持数据描述符(但 PKWare 发布的 zip 标准的最新更改现在包含对 zip 使用的数据描述符格式的一些支持)。
Mac OS X。虽然以前的 Mac 版本都有自己的 zip 端口,但 zip 将 Mac OS X 作为 Unix 端口的一部分来支持,并且大多数 Unix 功能都适用。以下对“MacOS”的引用通常指的是 OS X 之前的 Mac 版本。在下一个 zip 版本中,预计会支持一些 Mac OS X Unix 端口中的 Mac OS 功能,例如资源分支。
要获取关于 zip 和 unzip 的简要帮助,请在命令行中运行每个命令,而不指定任何参数。
用途
该程序可用于将一组文件打包以供分发;用于存档文件;以及通过临时压缩未使用的文件或目录来节省磁盘空间。
zip 程序将一个或多个压缩文件放入一个 zip 存档中,并包含关于文件的信息(名称、路径、上次修改的日期和时间、保护以及用于验证文件完整性的校验信息)。可以使用单个命令将整个目录结构打包到 zip 存档中。对于文本文件,常见的压缩比为 2:1 到 3:1。zip 具有一种压缩方法(deflation),也可以存储不进行压缩的文件。(如果添加了 bzip2 支持,zip 也可以使用 bzip2 压缩,但此类条目需要一个相对较新的 unzip 工具才能解压缩。选择 bzip2 压缩时,它将替换 deflation 作为默认方法。)zip 会自动为要压缩的每个文件选择较好的方法(deflation 或 store,或者如果选择 bzip2,则选择 bzip2 或 store)。
命令格式。基本命令格式如下:
zip options archive inpath inpath ...
其中,archive 是一个新的或现有的 zip 存档,inpath 是一个目录或文件路径,可以选择包含通配符。如果给出了现有 zip 存档的名称,zip 将替换 zip 存档中具有相同名称的条目(匹配存档中存储的相对名称),或者添加新名称的条目。例如,如果 foo.zip 存在并且包含 foo/file1 和 foo/file2,并且目录 foo 包含文件 foo/file1 和 foo/file3,则:
zip -r foo.zip foo
或者更简洁地:
zip -r foo foo
将替换 foo.zip 中的 foo/file1,并将 foo/file3 添加到 foo.zip 中。之后,foo.zip 将包含 foo/file1、foo/file2 和 foo/file3,其中 foo/file2 与之前保持不变。
因此,如果在执行 zip 命令之前,foo.zip 包含:
foo/file1 foo/file2
并且目录 foo 包含:
file1 file3
那么,foo.zip 将包含:
foo/file1 foo/file2 foo/file3
其中 foo/file1 已被替换,并且 foo/file3 是新的。
-@ file lists。如果指定了文件列表为 -@ [在 MacOS 上不可用],zip 将从标准输入而不是从命令行获取输入文件列表。例如,
zip -@ foo
会将标准输入中逐行列出的文件存储到 foo.zip 中。
在 Unix 下,此选项可以与 find (1) 命令结合使用,以实现强大的效果。 例如,要存档当前目录及其子目录中的所有 C 源代码文件:
find . -name "*.[ch]" -print | zip source -@
(请注意,该模式必须使用引号引起来,以防止 shell 扩展它)。
流式输入和输出。 zip 还会将单个短横线(“-”)作为 zip 文件名,在这种情况下,它会将 zip 文件写入标准输出,从而允许将输出通过管道传输到另一个程序。 例如:
zip -r - . | dd of=/dev/nrst0 obs=16k
会将 zip 输出直接写入具有指定块大小的磁带,用于备份当前目录。
zip 还会将单个短横线(“-”)作为要压缩的文件的名称,在这种情况下,它将从标准输入读取文件,从而允许 zip 从另一个程序获取输入。 例如:
tar cf - . | zip backup 将压缩 tar 命令的输出,以用于备份当前目录。
这通常比使用 -r 选项的先前示例产生更好的压缩效果,因为 zip 可以利用文件之间的冗余。 可以使用以下命令还原备份:
unzip -p backup | tar xf 如果未提供 zip 文件名且标准输出不是终端,则 zip 将作为过滤器运行,将标准输入压缩到标准输出。 例如:
tar cf - . | zip | dd of=/dev/nrst0 obs=16k
与以下命令等效:
tar cf - . | zip - - | dd of=/dev/nrst0 obs=16k
以这种方式创建的 zip 存档可以使用 unzip 包中提供的 funzip 程序或 gzip 包中提供的 gunzip 程序来提取(但某些 gunzip 可能不支持此功能,如果 zip 使用了 Zip64 扩展)。 例如:
dd if=/dev/nrst0 ibs=16k | funzip | tar xvf 也可以将流保存到文件中,然后使用 unzip。
如果启用了对大型文件和存档的 Zip64 支持,并且 zip 用作过滤器,则 zip 会创建一个需要 PKZIP 4.5 或更高版本的 unzip 才能读取的 Zip64 存档。 这是为了避免 zip 文件结构中的歧义,如当前 zip 标准(PKWARE AppNote)中定义,其中需要在使用数据写入条目之前做出是否使用 Zip64 的决定,但对于流,无法在此时知道数据的大小。 如果已知数据小于 4 GB,可以使用 -fz- 选项来防止使用 Zip64,但如果实际上需要 Zip64,zip 将会出错。 zip 3 和 unzip 6 及更高版本可以读取包含 Zip64 条目的存档。 此外,zip 在复制存档条目时会删除 Zip64 扩展(请参阅 -U(--copy)选项)。
在将输出重定向到另一个文件时,请注意所有选项都应在重定向之前,包括 -x。 例如:
zip archive "*.h" "*.c" -x donotinclude.h orthis.h > tofile
zip 文件。在更改现有的 zip 归档文件时,zip 会写入一个包含新内容的临时文件,并且只有在创建新版本的过程中没有发生错误后,才会替换旧文件。
如果 zip 归档文件的名称不包含扩展名,则会添加 .zip 扩展名。如果名称已经包含其他扩展名,则保留现有的扩展名不变。但是,分割归档文件(跨多个文件分割的归档文件)需要在最后一个分割文件上使用 .zip 扩展名。
扫描和读取文件。当 zip 启动时,它会扫描需要处理的文件(如果需要)。如果此扫描时间超过 5 秒,zip 将显示“正在扫描文件”消息,并每 2 秒或每处理一定数量的文件时显示一个进度点,以时间较长者为准。如果两个点之间的时间间隔超过 2 秒,这可能表明查找每个文件需要时间,并且可能意味着网络连接速度慢。(实际上,初始文件扫描是一个两步过程,首先是目录扫描,然后是排序,这两步之间用空格分隔。如果更新现有的归档文件,现有文件扫描和新文件扫描之间也会出现一个空格。)扫描文件的点不受 -ds 点大小选项的控制,但可以通过 -q 静默选项关闭点。可以使用 -sf 显示文件选项来扫描文件并获取扫描到的文件列表,而无需实际处理它们。
如果 zip 无法读取文件,它会发出警告但会继续执行。有关 zip 如何处理不匹配的模式和无法读取的文件,请参阅下面的 -MM 选项。如果跳过了一些文件,则会在 zip 操作结束时发出警告,说明读取了多少文件以及跳过了多少文件。
命令模式。zip 现在支持两种不同的命令模式:外部模式和内部模式。外部模式(添加、更新和刷新)从文件系统(以及从现有的归档文件)读取文件,而内部模式(删除和复制)仅对现有归档文件中的条目进行操作。
add
更新现有的条目并添加新文件。如果归档文件不存在,则创建它。这是默认模式。
update (-u)
如果文件系统中存在较新的文件,则更新现有的条目并添加新文件。如果归档文件不存在,则发出警告,然后创建一个新的归档文件。
freshen (-f)
更新归档文件中文件系统中较新的现有条目。不会将新文件添加到归档文件中。
delete (-d)
选择现有归档文件中的条目并删除它们。
copy (-U)
选择现有归档文件中的条目,并将它们复制到新的归档文件中。此新模式类似于更新,但命令行模式选择现有归档文件中的条目,而不是从文件系统中选择文件,并且它使用 --out 选项将结果归档文件写入到新文件中,而不是更新现有的归档文件,从而保持原始归档文件不变。
新的文件同步选项 (-FS) 也被视为一种新的模式,尽管它类似于更新模式。 此模式将存档与操作系统上的文件同步,仅在操作系统文件的文件时间和大小不同时,才替换存档中的文件,添加新文件,并删除存档中与操作系统上没有匹配的文件。由于此模式可以从存档中删除条目,请考虑制作存档的备份副本。
另请参阅 -DF 以创建差异存档。
请参阅下面的每个选项描述以获取详细信息,并参阅下面的“示例”部分以获取示例。
拆分存档。zip 版本 3.0 及更高版本可以创建拆分存档。拆分存档是一个标准 zip 存档,拆分为多个文件。(请注意,拆分存档不是简单地将存档拆分为多个部分,因为条目的偏移量现在基于每个拆分文件的开头。将这些部分连接在一起会使这些偏移量无效,但 unzip 通常可以处理它。zip 通常会拒绝处理此类拼接的存档,除非使用 -FF 修复选项来修复偏移量。)
拆分存档的一个用途是将大型存档存储在多个可移动介质上。对于包含 20 个拆分文件的拆分存档,文件通常命名为(将 ARCHIVE 替换为您的存档名称)ARCHIVE.z01、ARCHIVE.z02、...、ARCHIVE.z19、ARCHIVE.zip。请注意,最后一个文件是 .zip 文件。相比之下,分卷存档是原始的多磁盘存档,通常需要使用软盘,并使用卷标来存储磁盘编号。zip 支持拆分存档,但不支持分卷存档,尽管存在一种将具有正确大小的拆分存档转换为分卷存档的过程。反之亦然,可以将分卷存档的每个文件按顺序复制到具有上述名称的文件中,以创建拆分存档。
使用 -s 设置拆分大小并创建拆分存档。大小表示为一个数字,后跟可选的 k(KB)、m(MB)、g(GB)或 t(TB)(默认值为 m)。可以使用 -sp 选项在拆分之间暂停 zip,以允许更改可移动介质,例如,但请阅读 -s 和 -sp 下方的说明和警告。
虽然 zip 不更新拆分存档,但 zip 提供了新的选项 -O (--output-file 或 --out) 以允许更新拆分存档并将其保存到新的存档中。例如:
zip inarchive.zip foo.c bar.c --out outarchive.zip
读取存档 inarchive.zip(即使已拆分),添加文件 foo.c 和 bar.c,并将结果存档写入 outarchive.zip。如果 inarchive.zip 已经拆分,则 outarchive.zip 默认为相同的拆分大小。请注意,如果 outarchive.zip 和任何创建的拆分文件已经存在,则这些文件将始终被覆盖,且不会发出任何警告。这可能会在未来更改。
Unicode。虽然 zip 标准要求使用特定的字符集在存档中存储路径,但在实践中,zip 存档使用本地字符集存储存档中的路径。这会在存档在一个使用一种字符集创建或更新的系统上创建,然后在另一个使用不同字符集的系统上提取时产生问题。如果在支持宽字符的平台上使用 Unicode 支持进行编译,zip 现在除了标准的本地路径(为了向后兼容)之外,还存储路径的 UTF-8 翻译。这提供了一个通用的字符集,用于存储路径,允许这些路径在其他支持 Unicode 的系统上完全提取,并在不支持 Unicode 的系统上尽可能匹配
在 Win32 系统上,路径内部以 Unicode 存储,但以本地字符集表示,因此在本地字符集目录扫描期间,可能会跳过某些路径。现在,支持 Unicode 的 zip 格式可以读取和存储这些路径。请注意,Win 9x 系统和 FAT 文件系统并不完全支持 Unicode。
请注意,Win32 和 Unix 上的控制台窗口有时无法准确显示所有字符,因为每个操作系统都会切换用于显示的字符集。但是,如果加载了所需的字体,目录导航工具应显示正确的路径。
命令行格式。此版本的 zip 具有更新的命令行处理和对长选项的支持。
短选项的格式为:
-s[-][s[-]...][value][=value][ value]
其中,s 是一个或两个字符的短选项。以值结尾的短选项是参数中的最后一个,并且其后的所有内容都将作为该值。如果该选项可以被否定,并且紧跟一个“-”,则该选项将被否定。短选项也可以作为单独的参数给出:
-s[-][value][=value][ value] -s[-][value][=value][ value] ...
通常,短选项以两种方式获取值:作为同一参数的一部分,或作为以下参数。可选的“=”也受支持。因此:
-ttmmddyyyy
和
-tt=mmddyyyy
和
-tt mmddyyyy
都可以使用。-x 和 -i 选项接受值列表,并使用略有不同的格式,如下面所述。请参阅 -x 和 -i 选项。
长选项的格式为:
--longoption[-][=value][ value]
其中,选项以“--”开头,具有多字符名称,可以包含尾随的破折号以否定该选项(如果该选项支持),并且可以通过在其前面添加“=”(无空格)来指定值(选项参数)。值也可以跟在参数之后。因此:
--before-date=mmddyyyy
和
--before-date mmddyyyy
都可以使用。
长选项名称可以缩短为最短的唯一缩写。请参见下面的选项说明,以了解哪些选项支持长选项。为了避免混淆,请避免缩写带有嵌入破折号(“-”)的可以被否定的选项,如果在缩写时在破折号处,并且您计划否定它(解析器会将尾随的破折号,例如对于选项 --some-option 使用 --some- 作为该选项,视为名称的一部分,而不是否定破折号)。将来可能会更改此设置,以强制最后一个破折号 --someto 成为否定破折号。
选项
-a
--ascii
[使用 EBCDIC 的系统] 将文件转换为 ASCII 格式。
-A
--adjust-sfx
调整自解压可执行文件。自解压可执行文件是通过将 SFX 存根添加到现有存档中创建的。-A 选项告诉 zip 调整存档中存储的条目偏移量,以考虑到此“前缀”数据。
请注意:Amiga 的自解压存档是一种特殊情况。目前,只有 Amiga 版本的 zip 才能在不损坏存档的情况下调整或更新它们。可以使用 -J 删除 SFX 存根,如果需要进行其他更新。
-AC
--archive-clear
[WIN32] 一旦创建存档(如果使用 -T 进行测试,这是推荐的),则清除已处理文件的存档位。警告:一旦清除,就无法再恢复。
您可能需要使用 -sf show files 选项来存储已处理的文件列表,以防需要重复存档操作。此外,请考虑使用 -MM must match 选项。
请务必查看 -DF,它可能是一种更好的方法来执行增量备份。
-AS
--archive-set
[WIN32] 仅包含具有存档位的文件。使用 -AS 时,不存储目录,但默认情况下,条目的路径(包括目录)会按通常的方式存储,并且可以被大多数解压缩工具用于重新创建目录。
存档位由操作系统在文件修改时设置,如果与 -AC 一起使用,-AS 可以提供增量备份功能。但是,其他应用程序可能会修改存档位,因此它可能不是一个可靠的指示器,用于指示自上次存档操作以来哪些文件已更改。创建增量备份的替代方法是使用 -t 来使用文件日期,但这无法捕获复制到正在存档的目录中的旧文件,并且可以使用 -DF 来创建差异存档。
-B
--binary
[VM/CMS 和 MVS] 强制文件以二进制形式读取(默认是文本)。
-Bn [TANDEM] 使用 n 定义编辑/Enscribe 格式选项,其中:
位 0:不添加分隔符(编辑/Enscribe)
位 1:使用 LF 而不是 CR/LF 作为分隔符(编辑/Enscribe)
位 2:将记录空间填充到最大记录长度(Enscribe)
位 3:删除尾随空格(Enscribe)
位 8:强制使用 30K(扩展)大型读取来处理非结构化文件
-b path
--temp-path path
使用指定的路径作为临时 zip 存档。例如:
zip -b /tmp stuff *
会将临时 zip 存档放在 /tmp 目录中,并在完成后将 stuff.zip 复制到当前目录。当更新现有存档时,如果包含此旧存档的文件系统没有足够的空间来同时保存旧存档和新存档,此选项非常有用。在某些情况下,它也可能对流式处理有用,以避免需要数据描述符。请注意,使用此选项可能需要 zip 花费更多时间来在完成后将存档文件复制到目标文件系统。
-c
--entry-comments
为每个文件添加单行注释。首先执行文件操作(添加、更新),然后提示用户为每个文件输入单行注释。输入注释后按回车键,或者直接按回车键以跳过注释。
-C
--preserve-case
[VMS] 在 VMS 上保留大小写。使用 `-C-` 选项可以转换为小写。
-C2
--preserve-case-2
[VMS] 在 VMS 上保留 ODS2 大小写。使用 `-C2-` 选项可以转换为小写。
-C5
--preserve-case-5
[VMS] 在 VMS 上保留 ODS5 大小写。使用 `-C5-` 选项可以转换为小写。
-d
--delete
从 zip 归档文件中删除条目。例如:
zip -d foo foo/tom/junk foo/harry/\* \*.o
将删除条目 foo/tom/junk,所有以 foo/harry/ 开头的文件,以及所有以 .o 结尾的文件(位于任何路径中)。请注意,使用反斜杠来禁止 shell 的路径名扩展,以便 zip 可以查看星号,从而使 zip 可以匹配 zip 归档文件的内容,而不是当前目录的内容。(在基于 MSDOS 的平台上不使用反斜杠。)也可以使用引号来转义星号,如下所示:
zip -d foo foo/tom/junk "foo/harry/*" "*.o"
如果在系统上不转义星号,而该系统的 shell 扩展通配符,则可能会将星号转换为当前目录中文件列表,并使用该列表从归档文件中删除条目。
在 MSDOS 上,`-d` 选项在匹配 zip 归档文件中的名称时区分大小写。这要求以大写形式输入文件名,如果它们是由 MSDOS 上的 PKZIP 压缩的。(我们考虑在路径不区分大小写的系统上使其不区分大小写,但归档文件可能来自一个区分大小写的系统,并且归档文件可能包含 Bar 和 bar 作为归档文件中的单独文件。)但是,请参阅新的选项 `-ic` 以忽略归档文件中的大小写。
-db
--display-bytes
显示运行的字节计数,显示已压缩的字节数和剩余的字节数。
-dc
--display-counts
显示已压缩的条目数和剩余的条目数。
-dd
--display-dots
在压缩每个条目时显示点(除了在具有自己进度指示器的端口上)。请参阅下面的 -ds 选项,以设置点的大小。默认情况下,每个 10MB 的输入文件显示一个点。-v 选项也显示点(先前以更高的速率显示,但现在 -v 选项也默认为 10MB),并且此速率也由 -ds 选项控制。
-df
--datafork
[MacOS] 仅将文件的 data-fork 包含在归档文件中。适合将文件导出到其他操作系统。资源 fork 将完全被忽略。
-dg
--display-globaldots
为整个归档文件显示进度点,而不是为每个文件显示。命令如下:
zip -qdgds 10m
会关闭大部分输出,只显示每 10MB 的点。
`-ds size`
`--dot-size size`
设置显示每个点之前处理的输入文件量。请参阅 `-dd` 以启用点显示。设置此选项会启用 `-dd`。大小的格式为 `nm`,其中 `n` 是一个数字,`m` 是一个乘数。目前,`m` 可以是 `k`(KB)、`m`(MB)、`g`(GB)或 `t`(TB),因此如果 `n` 是 100 且 `m` 是 `k`,则大小将是 100k,即 100 KB。默认值为 10 MB。
^ v 选项也显示点,现在默认也为 10 MB。此速率也受此选项控制。大小为 0 会关闭点。
此选项不控制“扫描文件”消息中的点,因为 zip 在扫描输入文件时会显示这些点。该点的间隔为 2 秒或固定数量的条目,以时间更长者为准。
`-du`
`--display-usize`
显示每个条目的未压缩大小。
`-dv`
`--display-volume`
如果正在读取现有存档,则显示正在读取和写入的卷(磁盘)编号。
`-D`
`--no-dir-entries`
不要在 zip 存档中创建目录条目。默认情况下,会创建目录条目,以便在 zip 存档中保存其属性。环境变量 `ZIPOPT` 可用于更改默认选项。例如,在 Unix 下使用 sh:
`ZIPOPT="-D"; export ZIPOPT`
(变量 `ZIPOPT` 可用于任何选项,包括 `-i` 和 `-x`,使用新的选项格式,如下面详细说明,并且可以包括多个选项。)选项 `-D` 是 `-x "*/"` 的简写,但后者之前无法设置为环境变量 `ZIPOPT` 中的默认值,因为 `ZIPOPT` 的内容会插入到命令行字符串的开头附近,而文件列表必须位于行尾。
此版本的 zip 允许在 `ZIPOPT` 中使用 `-x` 和 `-i` 选项,如果使用以下形式:
`-x file file ... @`
其中 `@`(一个参数,仅为 `@`)终止列表。
`-DF`
`--difference-archive`
创建一个存档,其中包含自原始存档创建以来所有的新增和修改文件。为此,输入文件列表和当前目录必须与原始 zip 操作期间相同。
例如,如果使用以下命令创建了现有的存档:
`zip -r foofull .`
在 `bar` 目录中,则命令
`zip -r foofull . -DF --out foonew`
同样在 `bar` 目录中,将创建存档 `foonew`,其中仅包含 `foofull` 中没有的文件,以及文件大小或文件时间与 `foofull` 中的文件不匹配的文件。
请注意,环境变量 `TZ` 应该设置为本地时区,以便此选项能够正常工作。自原始存档创建以来,时区发生变化可能会导致没有时间匹配,并且所有文件都将包含在内。
一种可能的备份目录的方法是,创建目录内容的常规存档作为完整备份,然后使用此选项创建增量备份。
`-e`
`--encrypt`
使用在终端上输入的密码对 zip 存档的内容进行加密(密码不会回显;如果标准错误输出不是 tty,则 zip 将退出并显示错误)。密码提示会重复显示,以防止用户因输入错误而导致问题。
-E
--longnames
[OS/2] 如果找到,则使用 .LONGNAME 扩展属性作为文件名。
-f
--freshen
仅当 zip 存档中的现有条目已比存档中的版本更新时,才替换(刷新)zip 存档中的现有条目;与更新选项 (-u) 不同,此选项不会添加尚未包含在 zip 存档中的文件。 例如:
zip -f foo
此命令应从与原始 zip 命令运行的相同目录运行,因为存储在 zip 存档中的路径始终是相对路径。
请注意,环境变量 TZ 应设置为本地时区,以便 -f、-u 和 -o 选项正常工作。
其背后的原因有些微妙,但与 Unix 格式的文件时间(始终为 GMT)和其他操作系统(始终为本地时间)之间的差异以及比较这两者之间的必要性有关。 典型的 TZ 值是 ``MET-1MEST''(中欧时间,并自动调整为“夏令时”或日光节约时间)。
格式为 TTThhDDD,其中 TTT 是时区,例如 MET,hh 是 GMT 和本地时间之间的差异,例如上述的 -1,DDD 是日光节约时间生效时的时间。 如果没有日光节约时间,则省略 DDD。 对于美国东部时区,为 EST5EDT。
-F
--fix
-FF
--fixfix
修复 zip 存档。 如果存档的某些部分丢失,可以使用 -F 选项,但这需要一个相对完整的中央目录。 像往常一样扫描输入存档,但 zip 会忽略某些问题。 结果存档应有效,但任何不一致的条目都将被排除。
如果加倍使用,如 -FF,则从头开始扫描存档,zip 会扫描特殊签名以标识存档成员之间的限制。 如果存档没有严重损坏,则单个 -F 选项更可靠,因此请首先尝试此选项。
如果存档损坏或末尾被截断,则必须使用 -FF。 这与 zip 2.32 不同,在 zip 2.32 中,-F 选项能够读取截断的存档。 现在,-F 选项更可靠地修复具有轻微损坏的存档,并且需要 -FF 选项来修复存档,在以前的版本中,-F 选项可能就足够了。
这两个选项都无法恢复以 ASCII 模式而不是二进制模式传输的存档。 修复后,unzip 的 -t 选项可能会显示某些文件具有错误的 CRC。 这样的文件无法恢复;可以使用 zip 的 -d 选项从存档中删除它们。
请注意,-FF 可能难以修复包含嵌入式 zip 存档的存档,该存档以非压缩方式存储在存档中,并且根据损坏情况,它可能会找到嵌入存档中的条目而不是存档本身。 首先尝试 -F,因为它没有这个问题。
修复命令的格式已更改。 例如,要修复损坏的归档文件 foo.zip,请使用:
zip -F foo --out foofix
此命令会尝试正常读取条目,并将良好的条目复制到新的归档文件 foofix.zip 中。 如果这不起作用,例如当归档文件被截断时,或者如果归档文件中已知存在的一些条目丢失了,则尝试使用:
zip -FF foo --out foofixfix
然后,将生成的归档文件与使用 -F 选项创建的归档文件进行比较。 -FF 选项可能会创建一个不一致的归档文件。 根据损坏的内容,然后可以使用 -F 选项来修复该归档文件。
可以使用 -F 选项修复具有丢失的拆分文件的拆分归档文件,前提是您拥有归档文件的最后一个拆分文件(.zip 文件)。 如果此文件丢失,则必须使用 -FF 选项来修复归档文件,这将提示您提供您拥有的拆分文件。
当前,修复选项无法恢复具有坏校验和或以其他方式损坏的条目。
-FI
--fifo [Unix] 通常,zip 会跳过读取遇到的任何 FIFO(命名管道),因为如果 FIFO 没有提供数据,zip 可能会挂起。 此选项指示 zip 读取找到的任何 FIFO 的内容。
-FS
--filesync
同步归档文件的内容与操作系统上的文件。 通常,当更新归档文件时,会添加新文件并更新已更改的文件,但不再存在于操作系统上的文件不会从归档文件中删除。 此选项启用一种新模式,该模式检查归档文件中的条目与文件系统。 如果条目的文件时间和文件大小与操作系统文件的文件时间和文件大小匹配,则将条目从旧的归档文件中复制,而不是从文件系统读取并压缩。 如果操作系统文件已更改,则将读取并压缩该条目,就像往常一样。 如果归档文件中的条目与操作系统上的文件不匹配,则将删除该条目。 启用此选项应该会创建与新归档文件相同的归档文件,但由于现有的条目被复制而不是压缩,因此使用 -FS 更新现有的归档文件可能比创建新的归档文件快得多。 此外,请考虑使用 -u 来更新归档文件。
为了使此选项起作用,应从创建归档文件的同一目录中更新归档文件,以便相对路径匹配。 如果要从旧的归档文件中复制的文件很少,那么创建新的归档文件可能更快。
请注意,环境变量 TZ 应该设置为本地时区,以便此选项能够正确工作。 自原始归档文件创建以来时区发生更改可能会导致没有时间匹配,并且所有文件都会被重新压缩。
此选项会从归档文件中删除文件。 如果需要保留原始归档文件,请先复制该归档文件,或者使用 --out 选项将更新的归档文件输出到新的文件中。 即使这可能会更慢,但创建具有新归档文件名称的新归档文件也是更安全的,可以避免归档文件和操作系统路径之间的不匹配,并且是首选方法。
-g
--grow
将指定的文件添加到现有的 zip 压缩文件中,而不是创建新的压缩文件。如果此操作失败,zip 会尝试将压缩文件恢复到其原始状态。如果恢复失败,压缩文件可能会损坏。如果不存在现有的压缩文件,或者至少有一个压缩文件成员需要更新或删除,则忽略此选项。
-h
-?
--help
显示 zip 帮助信息(如果 zip 不带任何参数运行,也会显示此信息)。
-h2
--more-help
显示扩展的帮助信息,包括更多关于命令行格式、模式匹配和更复杂的选项。
-i 文件
--include 文件
仅包含指定的,如:
zip -r foo . -i \*.c
这将只包含当前目录及其子目录中以 .c 结尾的文件。(注意:对于 PKZIP 用户,等效命令为:
pkzip -rP foo *.c
PKZIP 不允许在当前目录之外的目录中进行递归。)反斜杠避免了 shell 的文件名替换,因此匹配将在所有目录级别由 zip 执行。 [这适用于 Unix 和其他系统,其中 \ 转义下一个字符。对于其他系统,如果 shell 不处理 *,则不要使用 \,并且上述命令为:
zip -r foo . -i *.c
示例适用于 Unix,除非另有说明。] 因此,要包含直接位于当前目录下的目录 dir,请使用:
zip -r foo . -i dir/\*
或
zip -r foo . -i "dir/*"
以匹配诸如 dir/a 和 dir/b/file.c 这样的路径(在不进行 shell 中通配符扩展的端口上,如 MSDOS 和 Windows:
zip -r foo . -i dir/*
)。请注意,目前需要尾随的 / 来指定目录(如:
zip -r foo . -i dir/
以包含目录 dir)。
长选项形式的第一个示例是:
zip -r foo . --include \*.c
并且与短选项形式执行相同的操作。
虽然命令语法过去要求将 -i 放在命令行的末尾,但此版本实际上允许将 -i(或 --include)放在任何位置。文件列表在下一个以 - 开头的参数、命令行末尾或列表终止符 @ 处结束(一个参数,其本身就是 @)。因此,上面的命令可以这样给出:
zip -i \*.c @ -r foo .
例如。选项和列表中的第一个文件之间必须有空格。对于单个文件,可以使用单个值形式:
zip -i\*.c -r foo .
(选项和值之间没有空格)或
zip --include=\*.c -r foo .
作为其他示例。不建议使用单个值形式,因为它们可能令人困惑,特别是 -ifile 格式,如果文件的第一个字母与 i 组合形成以 i 开头的双字母选项,则可能会导致问题。使用 -sc 查看命令行将如何被解析。
此外,还可以使用:
zip -r foo . -_
这将仅包含当前目录及其子目录中与 include.lst 文件中的模式匹配的文件。
^ i 和 -x 选项用于匹配内部归档路径。有关模式的更多信息,请参阅 -R。
`-I`
`--no-image`
[Acorn RISC OS] 不要扫描镜像文件。使用此选项时,zip 不会将镜像文件(例如 DOS 分区或加载 SparkFS 时的 Spark 归档文件)视为目录,而是将其存储为单个文件。
例如,如果您加载了 SparkFS,则压缩 Spark 归档文件会生成一个包含目录(及其内容)的 zip 文件,而使用 `-I` 选项会生成一个包含 Spark 归档文件的 zip 文件。显然,在不使用 `-I` 选项的情况下,如果未加载 SparkFS,也可以获得第二种情况。
`-ic`
`--ignore-case`
[VMS, WIN32] 在匹配归档条目时忽略大小写。此选项仅在文件名区分大小写的系统上可用。在文件名不区分大小写的系统上,通常在文件系统上匹配文件时会忽略大小写,但在 `-f`(刷新)、`-d`(删除)、`-U`(复制)等模式下,在匹配归档条目时不会忽略大小写(目前 VMS 上的 `-f` 忽略大小写),因为归档条目可能来自文件名区分大小写的系统,并且归档中可能存在名称仅在大小写上不同的条目。`-ic` 选项使所有匹配都忽略大小写。这可能会导致多个归档条目匹配命令行模式。
`-j`
`--junk-paths`
仅存储已保存文件的名称(删除路径),并且不存储目录名称。默认情况下,zip 会存储完整的路径(相对于当前目录)。
`-jj`
`--absolute-path`
[MacOS] 记录完整路径(包括卷名)。将存储完整的路径,包括卷。默认情况下,将存储相对路径。
`-J`
`--junk-sfx`
删除任何附加的前缀数据(例如 SFX 存根)。
`-k`
`--DOS-names`
尝试将名称和路径转换为符合 MSDOS 规范,仅存储 MSDOS 属性(仅来自 Unix 的用户写入属性),并将条目标记为在 MSDOS 下创建(即使实际上并非如此);为了与不能处理某些名称(例如包含两个句点的名称)的 PKUNZIP 在 MSDOS 下兼容。
`-l`
`--to-crlf`
将 Unix 行尾字符 LF 转换为 MSDOS 约定 CR LF。不应在二进制文件上使用此选项。如果 zip 文件 intended 供 PKUNZIP 在 MSDOS 下使用,则可以使用此选项。如果输入文件已经包含 CR LF,则此选项会添加一个额外的 CR。这是为了确保在 Unix 上使用 `unzip -a` 可以获得原始文件的确切副本,以撤消 `zip -l` 的效果。有关如何处理二进制文件,请参阅 `-ll`。
`-la`
`--log-append`
附加到现有的日志文件。默认情况下,会覆盖文件。
`-lf logfilepath`
`--logfile-path logfilepath`
在给定的路径中打开一个日志文件。默认情况下,任何位于该位置的现有文件都会被覆盖,但使用 `-la` 选项会将现有文件打开,并将新的日志信息附加到任何现有信息中。只有警告和错误才会写入日志,除非也提供了 `-li` 选项,否则所有信息消息也会写入日志。
-li
--log-info
在日志中包含信息消息,例如正在压缩的文件名。默认情况下, 只会包含命令行、任何警告和错误以及最终状态。
-ll
--from-crlf
将 MSDOS 行尾 CR LF 转换为 Unix LF。此选项不应用于二进制文件。如果 zip 文件要在 Unix 下使用 unzip 命令进行解压缩,则可以使用此选项。如果文件已转换,并且稍后确定该文件为二进制文件,则会发出警告,并且该文件可能已损坏。在本版本中,如果 -ll 检测到二进制文件(在从文件中读取的第一个缓冲区中),zip 现在会发出警告并跳过该文件的行尾转换。此检查似乎可以检测到所有测试过的二进制文件,但原始检查仍然存在,如果转换后的文件稍后被确定为二进制文件,仍会发出警告。现在正在使用一种新的算法来检测二进制文件,该算法应该允许转换 UTF-8 和类似编码的文本文件中的行尾。
-L
--license
显示 zip 许可证。
-m
--move
将指定的移动到 zip 存档中;实际上,这会在创建指定的 zip 存档后删除目标目录/文件。如果目录在删除文件后变为空,则该目录也会被删除。在 zip 创建存档且没有错误之前,不会进行任何删除。这对于节省磁盘空间很有用,但也可能很危险,因此建议将其与 -T 结合使用,以在删除所有输入文件之前测试存档。
-MM
--must-match
所有输入模式必须匹配至少一个文件,并且所有找到的输入文件必须可读。通常,当输入模式不匹配任何文件时,会发出“名称不匹配”警告,并且当找到一个输入文件后,该文件丢失或无法读取时,会发出“丢失或无法读取”警告。在任何一种情况下,zip 都会继续创建存档,跳过丢失或无法读取的新文件,并且存档中已有的文件保持不变。在创建存档后,如果任何文件无法读取,zip 将返回 OPEN 错误代码(在大多数系统上为 18),而不是通常的成功返回(在大多数系统上为 0)。使用 -MM 时,只要输入模式不匹配(即,当会发出“名称不匹配”警告时),或者当输入文件无法读取时,zip 就会退出,并且不会创建任何存档。在任何一种情况下,zip 都会以 OPEN 错误退出。
此选项对于要压缩已知文件列表时非常有用,因此,任何丢失或无法读取的文件都会导致错误。在使用通配符时,它的用处较少,但如果任何输入模式不匹配至少一个文件,或者任何匹配的文件无法读取,zip 仍会以错误退出。如果您想无论如何都创建存档,并且只需要知道是否跳过了一些文件,请不要使用 -MM,只需检查返回代码即可。此外,-lf 可能会很有用。
-n suffixes
--suffixes suffixes
不要尝试压缩文件名带有给定后缀的文件。这些文件将在输出的 zip 文件中以 0% 压缩率存储,这样 zip 程序就不会浪费时间尝试压缩它们。后缀之间用冒号或分号分隔。例如:
zip -rn .Z:.zip:.tiff:.gif:.snd foo foo
这将把 foo 中的所有内容复制到 foo.zip 中,但会将任何以 .Z、.zip、.tiff、.gif 或 .snd 结尾的文件以未经压缩的形式存储(图像和声音文件通常具有自己专门的压缩方法)。默认情况下,zip 程序不会压缩具有以下扩展名的文件:.Z:.zip:.zoo:.arc:.lzh:.arj。这些文件将直接存储在输出的存档中。环境变量 ZIPOPT 可用于更改默认选项。例如,在 Unix 下,使用 csh:
setenv ZIPOPT "-n .gif:.zip"
要尝试压缩所有文件,请使用:
zip -n : foo
最大压缩选项 -9 也会尝试压缩所有文件,无论扩展名如何。
在 Acorn RISC OS 系统上,后缀实际上是文件类型(3 位十六进制格式)。默认情况下,zip 程序不会压缩具有以下文件类型的的文件:DDC:D96:68E(即存档、CFS 文件和 PackDir 文件)。
-nw
--no-wild
不要执行内部通配符处理(除非参数被转义,否则 shell 仍然会对通配符进行处理)。当读取路径列表并且不需要通配符替换时,这很有用。
-N
--notes
[Amiga, MacOS] 将 Amiga 或 MacOS 文件注释保存为 zip 文件注释。可以使用 unzip 的 -N 选项来恢复它们。如果也使用 -c,则只会提示输入那些没有文件注释的文件的注释。
-o
--latest-time
将 zip 存档的“上次修改”时间设置为 zip 存档中条目中找到的“上次修改”时间的最新(最早)时间。这也可以在没有其他操作的情况下使用。例如:
zip -o foo
这将更改 foo.zip 的上次修改时间,使其与 foo.zip 中条目的最新时间相同。
-O output-file
--output-file output-file
像往常一样处理存档更改,但不是更新现有的存档,而是将新的存档输出到 output-file。这对于更新存档而不更改现有存档很有用,并且输入存档必须与输出存档是不同的文件。
此选项可用于创建更新后的分段存档。它也可以与 -U 一起使用,将现有存档中的条目复制到新的存档中。请参见下面的“示例”部分。
另一种用途是将一个拆分大小的 zip 文件转换为另一个拆分大小。例如,要将一个具有 700 MB CD 拆分大小的存档转换为一个具有 2 GB DVD 拆分大小的存档,可以使用:
zip -s 2g cd-split.zip --out dvd-split.zip
这将使用复制模式。请参阅 -U。此外:
zip -s 0 split.zip --out unsplit.zip
会将一个拆分存档转换为一个单一文件存档。
复制模式会将流条目(使用数据描述符,并且应该与大多数解压缩工具兼容)转换为普通条目(应该与所有解压缩工具兼容),除非使用了标准加密。对于包含加密条目的存档,zipcloak 将解密这些条目并将它们转换为普通条目。
-p
--paths
将相对文件路径包含在存储在存档中的文件名称中。这是默认设置。-j 选项会忽略路径,仅存储文件名称。
-P password
--password password
使用密码加密 zip 文件条目(如果有)。这很危险!许多多用户操作系统都提供了让任何用户都能查看其他用户的当前命令行的方法;即使在独立系统上,也始终存在被人窥视的风险。将明文密码作为自动化脚本的一部分存储在命令行中更是糟糕。尽可能使用非回显的交互式提示来输入密码。(在安全性真正重要的场合,请使用强大的加密方法,例如 Pretty Good Privacy,而不是 zip 文件实用程序提供的相对较弱的标准加密。)
-q
--quiet
安静模式;消除信息性消息和注释提示。(例如,在 shell 脚本和后台任务中很有用。)
-Qn
--Q-flag n
[QDOS] 将关于文件的信息存储在文件头中,其中 n 定义为:
位 0:不添加任何文件的头部
位 1:为所有文件添加头部
位 2:在退出时不要等待交互式按键
-r
--recurse-paths
递归地遍历目录结构;例如:
zip -r foo.zip foo
或者更简洁地:
zip -r foo foo
在这种情况下,foo 目录中的所有文件和目录都将保存在名为 foo.zip 的 zip 存档中,包括名称以“.” 开头的那些文件,因为递归不会使用 shell 的文件名替换机制。如果您只想包含目录 foo 及其子目录中的特定文件子集,请使用 -i 选项来指定要包含的文件模式。您不应将 -r 与名称“.*”一起使用,因为这会匹配“..”,这将尝试将父目录压缩起来(可能不是您想要的结果)。
允许多个源目录,如下所示:
zip -r foo foo1 foo2
这将首先压缩 foo1,然后压缩 foo2,依次遍历每个目录。
请注意,虽然 -r 处的通配符通常会在递归遍历文件系统中的目录时进行解析,但任何 -R、-x 和 -i 通配符都会在扫描目录后应用于内部存档路径名。要使通配符应用于 Unix 和类似系统中的子目录中的文件,在递归时,请转义所有通配符或将所有包含通配符的参数放在引号中。这样可以让 zip 查看通配符,并在递归时使用它们来匹配子目录中的文件。
-R
--recurse-patterns
从当前目录开始递归地遍历目录结构;例如:
zip -R foo "*.c"
在这种情况下,从当前目录开始的树中所有匹配 *.c 的文件都会被存储到名为 foo.zip 的 zip 归档文件中。请注意,*.c 将匹配 file.c、a/file.c 和 a/b/.c。可以列出多个模式作为单独的参数。请注意,对于 PKZIP 用户,等效命令是:
pkzip -rP foo *.c
模式是相对的文件路径,如它们在归档文件中出现,或者在压缩后将如何出现,并且可以包含可选的通配符。例如,如果当前目录是 foo,并且在其下有目录 foo1 和 foo2,并且在 foo1 中有一个文件 bar.c,则:
zip -R foo/*
将压缩 foo、foo/foo1、foo/foo1/bar.c 和 foo/foo2。
zip -R */bar.c
将压缩 foo/foo1/bar.c。请参阅有关 -r 选项的通配符转义说明。
-RE
--regex
[WIN32] 在 zip 3.0 之前,Windows 平台默认启用正则表达式列表匹配。由于需要转义名称中的 "[" 和 "]",这导致了混淆,因此现在默认情况下在 Windows 上禁用它,因此 "[" 和 "]" 只是名称中的普通字符。此选项重新启用 [] 匹配。
-s splitsize
--split-size splitsize
启用创建分割归档并设置分割大小。分割归档是可以分割成多个文件的归档。当创建归档时,如果归档的大小达到指定的分割大小,则该分割将关闭并打开下一个分割。通常,除了最后一个之外的所有分割都将是分割大小,而最后一个将是剩余的内容。如果整个归档小于分割大小,则将创建一个单文件归档。
分割归档存储在编号的文件中。例如,如果输出归档名为 archive,并且需要三个分割,则生成的归档将在三个文件中:archive.z01、archive.z02 和 archive.zip。不要更改这些文件的编号,否则归档将无法读取,因为这些编号用于确定读取分割的顺序。
分割大小是一个数字,后跟一个可选的乘数。当前,该数字必须是整数。乘数可以是 k(千字节)、m(兆字节)、g(千兆字节)或 t(太字节)。由于 64k 是最小的分割大小,因此没有乘数的数字默认为兆字节。例如,要创建一个名为 foo 的分割归档,其中包含 bar 目录的内容,分割大小为 670 MB,这对于刻录到 CD 上可能很有用,可以使用以下命令:
zip -s 670m -r foo bar
当前,分割归档的旧分割不会从新的归档中排除,但可以明确排除。如果可能,请将输入和输出归档保留在要压缩的路径之外。
使用 -s 选项但不使用 -sp 选项,如上所示,会在每次写入 foo 时创建所有分割,在这种情况下,就是当前目录。这种分割模式会在创建存档时更新分割,需要所有分割都保持可写状态,但会创建可由任何支持分割存档的解压缩程序读取的分割存档。请参阅下面的 -sp 选项,以启用分割暂停模式,该模式允许将分割直接写入可移动介质。
可以使用 -sv 选项启用详细分割,并提供有关如何进行分割的详细信息。可以使用 -sb 选项,在 zip 为下一个分割目标暂停时发出蜂鸣声。
分割存档无法更新,但请参阅 -O (--out) 选项,了解如何将分割存档在复制到新存档时进行更新。还可以使用 0 作为分割大小,或通过否定 -s 选项,将分割存档转换为单个文件存档:
zip -s 0 split.zip --out single.zip
另请参阅 -U (--copy) 选项,了解更多关于使用复制模式的信息。
-sb
--split-bell
如果正在进行分割并使用分割暂停模式,则在 zip 为每个分割目标暂停时发出蜂鸣声。
-sc
--show-command
显示启动 zip 的命令行,然后退出。新的命令行解析器会重新排列参数,将所有选项及其关联的值放在所有非选项参数之前。这意味着一个选项可以出现在命令行中的任何位置,只要与其选项关联的所有值都与其一起。此选项显示 zip 看到的命令行,包括来自环境的任何参数,例如来自 ZIPOPT 变量的参数。在允许的情况下,命令行中较后的选项可以覆盖较早的选项。
-sf
--show-files
显示将要操作的文件,然后退出。例如,如果正在创建新的存档,这将列出将要添加的文件。如果该选项被否定,`-sf-`,则仅输出到打开的日志文件。不建议对大型列表进行屏幕显示。
-so
--show-options
显示 zip 在当前系统上编译时支持的所有可用选项。由于此命令读取选项表,因此它应该包括所有选项。每一行都包括短选项(如果已定义)、长选项(如果已定义)、任何与选项关联的值的格式、该选项是否可以被否定以及一个简短的描述。值格式可以是无值、必需值、可选值、单个字符值、数字值或一个值列表。此选项的输出并非旨在显示如何使用任何选项,而只是显示哪些选项可用。
-sp
--split-pause
如果使用 `-s` 选项启用了分割,则启用分割暂停模式。这会创建与 `-s` 选项相同的分割存档,但使用流式写入,以便每个分割在写入后可以立即关闭,并且 zip 将在每个分割之间暂停,以允许更改分割目标或介质。
-sp
--split-size size
将存档拆分为最多 size 字节的多个文件。虽然此拆分模式允许将拆分直接写入可移动媒体,但它使用流存档格式,某些解压缩程序可能无法读取。在使用 -sp 创建的拆分之前,请使用您将使用的解压缩程序测试拆分存档。
要将流拆分存档(使用 -sp 创建)转换为标准存档,请参阅 --out 选项。
-su
--show-unicode
类似于 -sf,但也显示 Unicode 版本的路径(如果存在)。
-sU
--show-just-unicode
类似于 -sf,但仅显示 Unicode 版本的路径(如果存在),否则显示标准版本的路径。
-sv
--split-verbose
启用各种详细消息,显示拆分是如何进行的。
-S
--system-hidden
[MSDOS、OS/2、WIN32 和 ATARI] 包括系统文件和隐藏文件。
[MacOS] 包括 Finder 不可见的文件,否则这些文件会被忽略。
-t mmddyyyy
--from-date mmddyyyy
不要处理在指定日期之前修改的文件,其中 mm 是月份(00-12),dd 是月份中的日期(01-31),yyyy 是年份。ISO 8601 日期格式 yyyy-mm-dd 也可以接受。例如:
zip -rt 12071991 infamy foo
zip -rt 1991-12-07 infamy foo
将添加 foo 及其子目录中所有最后修改于 1991 年 12 月 7 日或之后的文件到 zip 存档 infamy.zip 中。
-tt mmddyyyy
--before-date mmddyyyy
不要处理在指定日期之后或该日期修改的文件,其中 mm 是月份(00-12),dd 是月份中的日期(01-31),yyyy 是年份。ISO 8601 日期格式 yyyy-mm-dd 也可以接受。例如:
zip -rtt 11301995 infamy foo
zip -rtt 1995-11-30 infamy foo
将添加 foo 及其子目录中所有最后修改于 1995 年 11 月 30 日之前的文件到 zip 存档 infamy.zip 中。
-T
--test
测试新 zip 文件的完整性。如果检查失败,旧 zip 文件将保持不变,并且(使用 -m 选项)不会删除任何输入文件。
-TT cmd
--unzip-command cmd
使用命令 cmd 代替“unzip -tqq”来测试存档,当使用 -T 选项时。在 Unix 上,要使用当前目录中的 unzip 副本而不是标准系统 unzip,可以使用:
zip archive file1 file2 -T -TT "./unzip -tqq"
在 cmd 中,{} 将被替换为临时存档的名称,否则存档的名称将被附加到命令的末尾。将检查返回值以查看是否成功(在 Unix 上为 0)。
-u
--update
仅当现有条目已修改且比 zip 存档中的版本更新时,才替换(更新)zip 存档中的现有条目。例如:
zip -u stuff *
将添加当前目录中的任何新文件,并更新自上次创建/修改 zip 存档 stuff.zip 以来已修改的任何文件(请注意,zip 不会尝试将 stuff.zip 打包到自身中)。
请注意,不带输入文件参数的 -u 选项的作用类似于 -f(freshen)选项。
-U
--copy-entries
从一个归档文件复制条目到另一个归档文件。需要使用 --out 选项来指定与输入归档文件不同的输出文件。复制模式与 -d delete 相反。当使用 --out 选项时,delete 会从归档文件中删除选定的条目,并将所有其他条目复制到新的归档文件中,而复制模式会选择要包含在新归档文件中的文件。与 -u update 不同,命令行上的输入模式仅与归档条目匹配,而不与文件系统文件匹配。例如:
zip inarchive "*.c" --copy --out outarchive
会将名称以 .c 结尾的条目从 inarchive 复制到 outarchive。在某些系统上,必须转义通配符,以防止 shell 替换文件系统中的文件名,这些文件名可能与归档文件中的条目无关。
如果命令行中没有出现任何输入文件,并且使用了 --out,则假定为复制模式:
zip inarchive --out outarchive
这对于更改拆分大小非常有用。目前不支持使用复制模式对条目进行加密和解密。请使用 zipcloak。
-UN v
--unicode v
确定 zip 应该如何处理 Unicode 文件名。zip 3.0 除了标准文件路径外,还包括 UTF-8 翻译的文件路径,如果条目路径不是完全为 7 位 ASCII 字符。当条目缺少 Unicode 路径时,zip 会恢复到标准文件路径。使用标准路径的问题是,该路径采用创建条目的 zip 的本地字符集,其中可能包含在解压缩 zip 时使用的字符集中无效的字符。当 zip 正在读取归档文件时,如果条目也具有 Unicode 路径,zip 现在默认使用 Unicode 路径来使用当前的本地字符集重新创建标准路径。
此选项可用于确定如果存储的标准路径与存储的 UTF-8 路径之间存在不匹配(如果已更新标准路径,则可能会发生这种情况),zip 应该如何处理此路径。在所有情况下,如果存在不匹配,则假定标准路径更新,并且 zip 使用该路径。v 的值为:
q - 如果路径不匹配则退出
w - 警告,继续使用标准路径
i - 忽略,继续使用标准路径
n - 不使用 Unicode 路径
默认情况下,会发出警告并继续。
在当前字符集中无效的字符将作为 #Uxxxx 和 #Lxxxxxx 进行转义,其中 x 是十六进制数字的 ASCII 字符。如果可以使用 16 位字符号来表示 Unicode 字符,则使用第一个,如果字符需要更多 16 位来表示其 Unicode 字符代码,则使用第二个。将 -UN 设置为:
e - 转义
如下所示:
zip archive -sU -UN=e
会强制 zip 转义所有非可打印 7 位 ASCII 字符。
通常,zip 在 UTF-8 是当前字符集的系统上,将 UTF-8 直接存储在标准路径字段中,否则将 UTF-8 存储在新的扩展字段中。该选项
u - UTF-8
就像这样:
zip 存档目录 -r -UN=UTF8
强制 zip 将 UTF-8 作为本机格式存储在存档中。请注意,在支持它的 Unix 系统上,直接存储 UTF-8 是默认设置。此选项在 Windows 系统上可能很有用,因为转义后的路径可能太大,无法成为有效的路径,并且 UTF-8 版本的路径更小,但本机 UTF-8 在 Windows 系统上与旧版本不兼容。
-v
--verbose
详细模式或打印诊断版本信息。
通常,当应用于实际操作时,此选项会在压缩过程中启用进度指示器的显示(有关更多信息,请参阅 -dd),并请求有关 zip 文件结构异常的详细诊断信息。
但是,当 -v 是唯一的命令行参数时,会打印一个诊断屏幕。现在即使 stdout 重定向到文件,这也应该有效,从而可以轻松保存信息以发送给 Info-ZIP 以供错误报告。版本屏幕提供带有程序名称、版本和发布日期的帮助屏幕标题、指向 Info-ZIP 主页和分发站点的一些指针,并显示有关目标环境(编译器类型和版本、操作系统版本、编译日期以及用于创建 zip 可执行文件所启用的可选功能)的信息。
-V
--VMS-portable
[VMS] 保存 VMS 文件属性。(文件在 EOF 处被截断。)当在非 VMS 系统上解压缩带有 -V 存档时,某些文件类型(特别是 Stream_LF 文本文件和纯二进制文件,如固定 512)应该被完整地提取。索引文件和具有嵌入记录大小的文件类型(特别是可变长度记录类型)在其他地方可能被视为损坏。
-VV
--VMS-specific
[VMS] 保存 VMS 文件属性,以及文件中所有已分配的块,包括超出 EOF 的任何数据。对于在 VMS 系统之间移动格式不正确的的文件很有用。当在非 VMS 系统上解压缩带有 -VV 存档时,几乎所有文件都将显示为损坏。
-w
--VMS-versions
[VMS] 将文件的版本号附加到名称中,包括文件的多个版本。默认情况下,仅使用指定文件的最新版本。
-ww
--VMS-dot-versions
[VMS] 将文件的版本号附加到名称中,包括文件的多个版本,使用 .nnn 格式。默认情况下,仅使用指定文件的最新版本。
-ws
--wild-stop-dirs
通配符仅在目录级别匹配。通常,zip 将路径视为字符串,并且给定以下路径:
/foo/bar/dir/file1.c
/foo/bar/file2.c
例如,输入模式
/foo/bar/*
通常会匹配这两个路径,* 匹配 dir/file1.c 和 file2.c。请注意,在第一种情况下,在匹配中跨越了一个目录边界(/)。使用 -ws,不会在匹配中包含目录边界,从而使通配符仅限于特定目录级别。因此,在使用 -ws 启用时,仅会匹配第二个路径。
使用 -ws 时,使用 ** 来匹配跨目录的文件,就像 * 通常那样。
-x 文件
--exclude 文件
显式排除指定的文件,例如:
zip -r foo foo -x \*.o
这将把 foo 目录的内容包含在 foo.zip 中,同时排除所有以 .o 结尾的文件。反斜杠防止 shell 执行文件名替换,以便 zip 在所有目录级别执行名称匹配。
也可以使用:
zip -r foo foo -_
这将把 foo 目录的内容包含在 foo.zip 中,同时排除所有与 exclude.lst 文件中的模式匹配的文件。
上述选项的长形式是:
zip -r foo foo --exclude \*.o
和
zip -r foo foo --exclude @exclude.lst
可以指定多个模式,例如:
zip -r foo foo -x \*.o \*.c
如果在 -x 和模式之间没有空格,则假定只有一个值(不是列表):
zip -r foo foo -x\*.o
有关包含和排除的更多信息,请参见 -i。
-X
--no-extra
不保存额外的文件属性(OS/2 上的扩展属性,以及 Unix 上的 uid/gid 和文件时间)。zip 格式使用额外的字段来包含每个条目的附加信息。一些额外的字段是特定于特定系统的,而另一些则适用于所有系统。通常,当 zip 从现有存档中读取条目时,它会读取它知道的额外字段,删除其余字段,并添加适用于该系统的额外字段。使用 -X 时,zip 会删除所有旧字段,并且仅包含 Unicode 和 Zip64 额外字段(当前这两个额外字段无法禁用)。
否定此选项,-X-,将包含所有默认的额外字段,并且还会复制任何未识别的额外字段。
-y
--symlinks
对于 UNIX 和 VMS(V8.3 及更高版本),将符号链接作为符号链接存储在 zip 存档中,而不是压缩和存储链接指向的文件。这可以避免在 zip 递归目录树并直接访问文件以及通过链接访问文件时,将同一文件的多个副本包含在存档中。
-z
--archive-comment
提示输入整个 zip 存档的多行注释。注释以仅包含句点的一行或文件结尾条件(Unix 上的 ^D,MSDOS、OS/2 和 VMS 上的 ^Z)结束。注释可以从文件中读取:
zip -z foo < foowhat
-Z cm
--compression-method cm
设置默认压缩方法。当前 zip 支持的主要方法是存储和 deflate。压缩方法可以设置为:
store - 将压缩方法设置为存储,强制 zip 以不压缩的方式存储条目。这通常比压缩条目更快,但不会节省空间。这与使用 -0(压缩级别零)的效果相同。
deflate - 这是 zip 的默认方法。如果 zip 确定存储比压缩更好,则该条目将以存储方式存储。
bzip2 - 如果编译了 bzip2 支持,则此压缩方法也将可用。只有一些现代的解压缩工具当前支持 bzip2 压缩方法,因此在使用依赖于使用此方法的存档(压缩方法 12)之前,请测试您将使用的解压缩工具。
例如,要使用 bzip2 压缩将 bar.c 添加到名为 foo 的存档中:
zip -Z bzip2 foo bar.c
压缩方法可以缩写:
zip -Zb foo bar.c
-#
(-0, -1, -2, -3, -4, -5, -6, -7, -8, -9)
使用指定的数字 # 调节压缩速度,其中 -0 表示不进行压缩(存储所有文件),-1 表示最快的压缩速度(压缩率较低),-9 表示最慢的压缩速度(最佳压缩,忽略后缀列表)。默认压缩级别为 -6。
虽然仍在开发中,但其目的是让此设置控制所有压缩方法的压缩速度。目前,只有 deflate 算法受到控制。
-!
--use-privileges
[WIN32] 使用权限(如果已授予)获取 WinNT 安全的所有方面。
-@
--names-stdin
从标准输入获取输入文件列表。每行一个文件名。
-$
--volume-label
[MSDOS, OS/2, WIN32] 包含包含要压缩的第一个文件的驱动器的卷标。如果您只想包含卷标或强制使用特定驱动器,请将驱动器名作为第一个文件名,如下所示:
zip -$ foo a: c:bar
示例
最简单的示例:
zip stuff *
这将创建存档 stuff.zip(假设它不存在),并将当前目录中的所有文件放入其中,以压缩形式(.zip 后缀会自动添加,除非存档名称已经包含一个点;这允许显式指定其他后缀)。
由于 Unix 上的 shell 处理文件名替换的方式,因此不会包含以“.” 开头的文件;要包含这些文件,请使用:
zip stuff .* *
即使这样也不会包含当前目录中的任何子目录。
要压缩整个目录,可以使用以下命令:
zip -r foo foo
这将创建存档 foo.zip,其中包含当前目录中目录 foo 中的所有文件和目录。
您可能希望创建一个包含目录 foo 中的文件的 zip 存档,而不记录目录名称 foo。您可以使用 -j 选项省略路径,如下所示:
zip -j foo foo/*
如果磁盘空间不足,可能没有足够的空间来容纳原始目录和相应的压缩 zip 存档。在这种情况下,可以使用 -m 选项分步骤创建存档。如果 foo 包含子目录 tom、dick 和 harry,则可以:
zip -rm foo foo/tom
zip -rm foo foo/dick
zip -rm foo foo/harry
其中第一个命令创建 foo.zip,接下来的两个命令将其添加到存档中。在每个 zip 命令完成时,最后一个创建的存档将被删除,为下一个 zip 命令腾出空间。
使用 -s 设置拆分大小并创建拆分存档。大小表示为一个数字,后跟可选的 k(KB)、m(MB)、g(GB)或 t(TB)。命令
zip -s 2g -r split.zip foo
创建一个名为 split.zip 的分割压缩包,其中包含目录 foo,并且每个分割压缩包的大小不超过 2 GB。如果 foo 包含 5 GB 的内容,并且这些内容以未压缩的形式存储在分割压缩包中(为了简化示例),这将创建三个分割压缩包:split.z01 大小为 2 GB,split.z02 大小为 2 GB,split.zip 大小略大于 1 GB。
可以使用 -sp 选项在分割压缩包之间暂停 zip,以便更换可移动介质,但请阅读下面关于 -s 和 -sp 的说明和警告。
虽然 zip 不更新分割压缩包,但 zip 提供了新的选项 -O (--output-file),允许更新分割压缩包并将其保存到新的压缩包中。例如:
zip inarchive.zip foo.c bar.c --out outarchive.zip
读取压缩包 inarchive.zip(即使是分割压缩包),添加文件 foo.c 和 bar.c,并将结果写入 outarchive.zip。如果 inarchive.zip 是分割压缩包,那么 outarchive.zip 将默认使用相同的分割大小。请注意,outarchive.zip 以及使用它创建的任何分割文件都会被覆盖,且不会发出任何警告。未来可能会更改此行为。
模式匹配
本节仅适用于 Unix。请关注后续有关 MSDOS 和 VMS 操作的详细信息。但是,下面特殊通配符 * 和 [] 至少适用于 MSDOS。
Unix shell(sh、csh、bash 等)通常会对命令行参数执行文件名替换(也称为“通配符扩展”)。通常,特殊字符如下:
? 匹配任何单个字符
* 匹配任意数量的字符(包括零个字符)
[] 匹配括号内指示的范围内的任何字符(例如:[a-f]、[0-9])。
这种形式的通配符匹配允许用户在方括号之间指定一个字符列表,如果任何字符与表达式匹配,则该表达式匹配。例如:
zip archive "*.[hc]"
将归档当前目录中所有以 .h 或 .c 结尾的文件。
支持字符范围:
zip archive "[a-f]*"
将添加到归档中,所有以“a”到“f”开头的的文件。
还支持否定,即该位置的任何不在列表中的字符都匹配。通过在列表的开头添加 ! 或 ^ 来支持否定:
zip archive "*.[!o]"
匹配不以“.o”结尾的文件。
在 WIN32 上,需要使用 -RE 选项启用 [] 匹配,以避免名称中包含 [ 或 ] 造成的混淆。
当遇到这些字符时(如果没有使用反斜杠或引号进行转义),shell 将查找与该模式相对的当前路径中的文件,并用匹配的名称列表替换该参数。
zip 程序也可以对 zip 压缩包中要修改的名称执行相同的匹配,或者对于 -x(排除)或 -i(包含)选项,对要操作的文件列表执行匹配,方法是使用反斜杠或引号告诉 shell 不要执行名称扩展。通常,当 zip 遇到要处理的文件列表中的名称时,它首先在文件系统中查找该名称。如果找到,则将其添加到要处理的文件列表中。如果未找到,它将在要修改的 zip 压缩包中查找该名称(如果存在),并使用上面描述的模式匹配字符(如果存在)。对于每个匹配项,它会将该名称添加到要处理的文件列表中,除非该名称与 -x 选项中给定的名称匹配,或者不与 -i 选项中给定的任何名称匹配。
模式匹配包括路径,因此像 *.o 这样的模式会匹配以“.o”结尾的所有名称,无论路径前缀是什么。请注意,必须在每个特殊字符(即 ?*[])前面加上反斜杠,或者将整个参数用双引号("")括起来。
通常,对于包含通配符的路径,请使用反斜杠或双引号,以便让 zip 执行文件路径的模式匹配,并且始终对包含空格或通配符的路径和字符串使用 -i、-x、-R、-d 和 -U,以及任何需要 zip 处理通配符的地方。
环境
以下环境变量会被读取并由 zip 使用,具体用法如下:
ZIPOPT
包含默认选项,这些选项将在运行 zip 时使用。此环境变量的内容将被添加到命令行中,紧跟在 zip 命令之后。
ZIP
[不在 RISC OS 和 VMS 上] 请参见 ZIPOPT
Zip$Options [RISC OS] 请参见 ZIPOPT
Zip$Exts [RISC OS] 包含以冒号分隔的扩展名,如果本机文件名具有指定的扩展名之一,则会将基本名称和扩展名交换后添加到 zip 文件中。
ZIP_OPTS
[VMS] 请参见 ZIPOPT
另请参阅
compress(1), shar(1), tar(1), unzip(1), gzip(1)
诊断
退出状态(或错误级别)近似于 PKWARE 定义的退出代码,并且采用以下值,但在 VMS 上除外:
0 正常;未检测到任何错误或警告。
2 意外的 zip 文件结尾。
3 检测到 zip 文件格式中的通用错误。处理可能已成功完成;其他存档程序创建的一些损坏的 zip 文件具有简单的解决方法。
4 zip 无法为程序初始化期间的一个或多个缓冲区分配内存。
5 检测到 zip 文件格式中的严重错误。处理可能立即失败。
6 条目太大而无法处理(例如,当不使用 Zip64 或尝试读取过大的现有存档时,输入文件大于 2 GB),或者条目太大而无法使用 zipsplit 进行拆分。
7 无效的注释格式
8 zip -T 失败或内存不足
9 用户通过按 control-C(或类似方式)过早地中止了 zip。
10 zip 在使用临时文件时遇到错误
11 读取或查找错误
12 zip 与之无关
13 缺少或为空的 zip 文件
14 写入文件时出错
15 zip 无法创建用于写入的文件
16 命令行参数错误
18 zip 无法打开指定的文件进行读取
19 zip 是使用与此系统不兼容的选项编译的
VMS 将标准的 Unix(或 PC)返回值解释为更可怕的 VMS 风格状态码,因此 zip 将其映射为 VMS 风格的状态码。通常,zip 设置 VMS Facility = 1955 (0x07A3),Code = 2 * Unix_status,以及适当的 Severity(如 ziperr.h 中指定)。更多详细信息包含在 VMS 专用文档中。请参阅 [.vms]NOTES.TXT 和 [.vms]vms_msg_gen.c。
错误
zip 3.0 与 PKUNZIP 1.10 不兼容。使用 zip 1.1 生成可以由 PKUNZIP 1.10 提取的 zip 文件。
由 zip 3.0 生成的 zip 文件不能由 zip 1.1 或 PKZIP 1.10 更新,如果它们包含加密的成员,或者是在管道中或非可寻址设备上生成的。旧版本的 zip 或 PKZIP 会创建一个格式不正确的存档。旧版本可以列出 zip 文件的内容,但无论如何都无法提取它(因为新的压缩算法)。如果您不使用加密并使用常规磁盘文件,则不必担心此问题。
在 VMS 上,并非所有奇特的 文件格式都得到正确处理。只有 stream-LF 格式的 zip 文件才预期可以与 zip 一起工作。可以使用 Rahul Dhesi 的 BILF 程序将其他文件格式转换为这种格式。此版本的 zip 会在内部处理一些转换。在使用 Kermit 从 VMS 传输 zip 文件到 MSDOS 时,请在 VMS 上键入“set file type block”。在使用 Kermit 从 MSDOS 传输 zip 文件到 VMS 时,请在 VMS 上键入“set file type fixed”。在两种情况下,请在 MSDOS 上键入“set file type binary”。
在某些较旧的 VMS 版本中,如果文件规范使用 DECnet 语法 foo::*.*,zip 可能会挂起。
在 OS/2 上,zip 无法匹配某些名称,例如包含感叹号或井号的名称。这是 OS/2 本身的一个错误:32 位 DosFindFirst/Next 找不到这些名称。其他程序(如 GNU tar)也受到此错误的影响。
在 OS/2 上,DIR 显示的扩展属性数量(为了兼容性)是 16 位版本的 DosQueryPathInfo() 返回的数量。否则,OS/2 1.3 和 2.0 在 DIR 某个文件时会报告不同的 EA 大小。但是,32 位 DosQueryPathInfo() 返回的结构布局略有不同,它使用额外的填充字节和链接指针(它是一个链接列表),以便所有字段都在 4 字节边界上,以方便移植到未来的 OS/2 版本。因此,zip 报告的值(它使用这种 32 位模式大小)与 DIR 报告的值不同。zip 存储 32 位格式以提高可移植性,即使是 16 位 MS-C 编译版本在 OS/2 1.3 上运行时,它也会显示 32 位模式大小。
作者
版权所有 (C) 1997-2008 Info-ZIP。
目前根据 Info-ZIP 许可分发。
版权所有,1990-1997,Mark Adler、Richard B. Wales、Jean-loup Gailly、Onno van der Linden、Kai Uwe Rommel、Igor Mandrichenko、John Bush 和 Paul Kienitz。
原始版权声明:
允许任何个人或机构使用、复制或重新分发此软件,只要包含所有原始文件,并且不得将其出售以获取利润,并且必须保留此版权声明。
就像所有免费的东西一样,ZIP 及其相关实用程序是按“原样”提供的,不提供任何形式的保证,无论是明示的还是暗示的。在任何情况下,版权所有者均不对因使用此软件而造成的任何损害负责。
请通过以下网页发送错误报告和评论:www.info-zip.org。对于错误报告,请包括 zip 的版本(请参阅 zip -h)、用于编译的 make 选项(请参阅 zip -v)、使用的机器和操作系统,以及尽可能多的其他信息。
致谢
感谢 R. P. Byrne 编写的 Shrink.Pas 程序,该程序启发了本项目,并从中“借用”了 shrink 算法;感谢 Phil Katz 将 zip 文件格式、压缩格式和 .ZIP 文件名扩展名置于公共领域,并接受对文件格式的次要更改;感谢 Steve Burg 澄清 deflate 格式;感谢 Haruhiko Okumura 和 Leonid Broukhis 提供了一些有用的压缩算法想法;感谢 Keith Petersen、Rich Wales、Hunter Goatley 和 Mark Adler 提供了一个邮件列表和一个 ftp 站点,供 Info-ZIP 组使用;最重要的是,感谢 Info-ZIP 组本身(列表在 infozip.who 文件中),如果没有他们不懈的测试和修复错误,一个可移植的 zip 是不可能实现的。最后,我们应该感谢(责怪)第一任 Info-ZIP 版主 David Kirschbaum,是他让我们陷入了这种境地。Unix 上的手册页由 R. P. C. Rodgers 重写,并由 E. Gordon 为 zip 3.0 更新。