zip命令

zip 命令 #

zip命令用于创建和管理 ZIP 格式的压缩文件。ZIP 是一种广泛使用的压缩和归档格式,在 Windows、macOS 和 Linux 等多种操作系统上都有良好的支持。

语法 #

zip [选项] [压缩文件 [文件...]]

常用选项 #

选项 描述
-r 递归处理目录
-u 更新:仅添加新文件或更新的文件
-m 压缩后删除原始文件
-j 不记录目录名(junk paths)
-0 仅存储,不压缩
-1-9 压缩级别(1 最快,9 最好)
-e 加密 ZIP 文件
-P 密码 使用指定的密码加密(不安全,密码会显示在进程列表中)
-v 显示详细信息
-q 安静模式,不显示任何信息
-d 从 ZIP 文件中删除条目
-T 测试 ZIP 文件的完整性
-x 文件 排除指定的文件
-i 文件 仅包含指定的文件
-@ 从标准输入读取文件名
-F 修复损坏的 ZIP 文件
-y 保存符号链接,而不是链接指向的文件
-n 后缀 不压缩指定后缀的文件

常见用法 #

1. 创建 ZIP 文件 #

zip archive.zip file1.txt file2.txt

2. 递归压缩目录 #

zip -r archive.zip directory/

3. 创建加密的 ZIP 文件 #

zip -e archive.zip file1.txt file2.txt

系统会提示输入密码。

4. 使用指定密码创建加密 ZIP 文件(不安全) #

zip -P password archive.zip file1.txt file2.txt

注意:这种方式不安全,因为密码会显示在进程列表中。

5. 更新 ZIP 文件 #

zip -u archive.zip newfile.txt

这只会添加新文件或更新的文件。

6. 压缩后删除原始文件 #

zip -m archive.zip file1.txt file2.txt

7. 不记录目录结构 #

zip -j archive.zip directory/file1.txt directory/subdir/file2.txt

这会将所有文件添加到 ZIP 的根目录,忽略原始目录结构。

8. 设置压缩级别 #

# 最快压缩
zip -1 archive.zip file.txt

# 最佳压缩
zip -9 archive.zip file.txt

9. 仅存储文件,不压缩 #

zip -0 archive.zip file.txt

10. 显示详细信息 #

zip -v archive.zip file.txt

11. 从 ZIP 文件中删除条目 #

zip -d archive.zip file.txt

12. 测试 ZIP 文件的完整性 #

zip -T archive.zip

13. 排除特定文件 #

zip -r archive.zip directory/ -x "*.git*" "*.DS_Store"

14. 从标准输入读取文件名 #

find . -name "*.txt" | zip -@ archive.zip

15. 保存符号链接 #

zip -y archive.zip symlink

16. 不压缩特定类型的文件 #

zip -r archive.zip directory/ -n .jpg:.png:.mp3

这会存储而不压缩.jpg、.png 和.mp3 文件,因为它们已经是压缩格式。

与 unzip 结合使用 #

1. 解压 ZIP 文件 #

unzip archive.zip

2. 列出 ZIP 文件内容 #

unzip -l archive.zip

3. 解压到特定目录 #

unzip archive.zip -d /path/to/directory/

4. 解压加密的 ZIP 文件 #

unzip -P password archive.zip

或者不指定密码,系统会提示输入:

unzip archive.zip

实用示例 #

1. 备份目录 #

zip -r backup-$(date +%Y%m%d).zip important_directory/

2. 创建自解压 ZIP 文件(需要 unzip) #

echo '#!/bin/sh' > self_extract.sh
echo 'SKIP=`awk "/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }" $0`' >> self_extract.sh
echo 'tail -n+$SKIP $0 | unzip -' >> self_extract.sh
echo 'exit 0' >> self_extract.sh
echo '__ARCHIVE_BELOW__' >> self_extract.sh
zip -r - files_to_include/ >> self_extract.sh
chmod +x self_extract.sh

3. 分割大型 ZIP 文件 #

zip -r -s 100m large_archive.zip large_directory/

这会创建大小为 100MB 的分卷 ZIP 文件。

4. 合并分割的 ZIP 文件 #

zip -F large_archive.zip --out complete.zip

5. 比较两个 ZIP 文件的内容 #

diff <(unzip -l archive1.zip | sort) <(unzip -l archive2.zip | sort)

提示 #

  • 在 Linux 上,通常需要安装zipunzip包,因为它们可能不是默认安装的
  • ZIP 格式在跨平台文件共享时特别有用,因为 Windows、macOS 和 Linux 都支持它
  • 使用-e选项进行加密比使用-P选项更安全
  • ZIP 的加密功能相对较弱,对于敏感数据,考虑使用其他加密方法
  • 对于大型文件或需要更高压缩率的情况,考虑使用targzipbzip2xz结合
  • 使用-9可以获得最佳压缩率,但会增加压缩时间
  • 使用-0对已经压缩的文件(如 JPEG、MP3 等)可以节省处理时间
  • 在脚本中使用zip时,可以使用-q选项抑制输出
  • 使用-u选项可以实现增量备份
  • 使用-y选项可以保留符号链接,这在备份时可能很重要