Linux zip命令

简介

zip命令是Linux系统中用于创建ZIP格式压缩文件的命令行工具。ZIP是一种广泛使用的压缩文件格式,具有跨平台兼容性,特别是在Windows、macOS和Linux系统之间共享文件时非常方便。

特点:zip支持多种压缩算法(Deflate、BZIP2、LZMA等),可以创建加密压缩文件,支持分卷压缩,并能够保留文件权限、时间戳等元数据。

语法格式

zip [选项] 压缩文件名[.zip] 文件或目录... [-x 排除文件...] [-i 包含文件...]

常用选项

选项 说明
-r 递归处理,压缩目录及其子目录内容
-q 安静模式,不显示压缩过程信息
-v 详细模式,显示压缩过程的详细信息
-e 创建加密的ZIP文件,会提示输入密码
-P 密码 直接指定密码创建加密文件(不安全)
-0 到 -9 压缩级别,0不压缩,9最高压缩率
-j 只保存文件名,不保存目录结构
-m 压缩后删除原始文件(谨慎使用)
-u 更新现有的ZIP文件,添加新文件或更新旧文件
-d 从ZIP文件中删除指定文件
-x 文件 压缩时排除指定的文件或目录
-i 文件 只压缩指定的文件(可用通配符)
-FS 同步文件系统,只压缩文件系统上存在的文件
-T 测试压缩文件的完整性
-@ 从标准输入读取要压缩的文件列表
-X 不保存额外的文件属性(UID/GID等)
-y 保存符号链接本身而不是链接指向的文件
-l 将LF换行符转换为CRLF(Windows格式)
-ll 将CRLF换行符转换为LF(Unix格式)
-s 大小 创建分卷压缩,指定每个分卷的大小

安装方法

大多数Linux发行版默认安装了zip工具。如果没有安装,可以使用以下命令:

Debian/Ubuntu系统:
sudo apt update
sudo apt install zip
RHEL/CentOS/Fedora系统:
sudo yum install zip

# 或使用dnf(Fedora/RHEL8+)
sudo dnf install zip
Arch Linux系统:
sudo pacman -S zip
从源码编译安装:
# 下载源码
wget https://sourceforge.net/projects/infozip/files/Zip%203.x%20%28latest%29/3.0/zip30.tar.gz

# 解压
tar xzf zip30.tar.gz
cd zip30

# 编译安装
make -f unix/Makefile generic
sudo make -f unix/Makefile install

使用示例

示例1:基本压缩

压缩单个或多个文件:

# 创建测试文件
echo "Test content 1" > file1.txt
echo "Test content 2" > file2.txt

# 压缩单个文件
zip file1.zip file1.txt

# 压缩多个文件
zip files.zip file1.txt file2.txt

# 查看压缩文件内容
unzip -l files.zip
示例2:压缩整个目录

使用递归选项压缩目录及其子目录:

# 创建测试目录结构
mkdir -p myproject/docs
echo "Documentation" > myproject/docs/readme.txt
mkdir -p myproject/src
echo "Source code" > myproject/src/main.py

# 压缩整个目录
zip -r myproject.zip myproject/

# 查看压缩包内容
unzip -l myproject.zip | tree
示例3:指定压缩级别

使用不同的压缩级别:

# 创建测试文件
dd if=/dev/zero of=largefile.bin bs=1M count=10 2>/dev/null

# 使用最高压缩级别(9)
zip -9 max_compression.zip largefile.bin

# 使用最低压缩级别(0,只打包不压缩)
zip -0 no_compression.zip largefile.bin

# 使用默认压缩级别(6)
zip default_compression.zip largefile.bin

# 比较文件大小
ls -lh *.zip
示例4:创建加密ZIP文件

创建需要密码才能解压的ZIP文件:

# 方法1:交互式输入密码
zip -e secret.zip file1.txt file2.txt
# 提示输入密码两次

# 方法2:命令行指定密码(不安全,密码可能被其他用户看到)
zip -P "MySecret123" secret2.zip file1.txt

# 测试解压加密文件
unzip -P "MySecret123" secret2.zip
示例5:排除特定文件

压缩时排除某些文件或目录:

# 排除特定文件
zip -r project.zip myproject/ -x "*.log"

# 排除多个文件和目录
zip -r project.zip myproject/ -x "*.log" "*.tmp" "temp/"

# 排除隐藏文件(以.开头的文件)
zip -r project.zip myproject/ -x ".*"

# 只包含特定类型的文件
zip -r images.zip myproject/ -i "*.jpg" "*.png" "*.gif"
示例6:更新现有ZIP文件

向现有ZIP文件中添加新文件或更新旧文件:

# 创建初始ZIP文件
zip archive.zip file1.txt file2.txt

# 创建新文件
echo "New file content" > file3.txt

# 更新ZIP文件(添加新文件)
zip -u archive.zip file3.txt

# 更新已存在的文件(如果文件已修改)
echo "Updated content" > file1.txt
zip -u archive.zip file1.txt

# 从ZIP文件中删除文件
zip -d archive.zip file2.txt
示例7:创建分卷压缩

创建大型文件的分卷压缩:

# 创建大型测试文件
dd if=/dev/zero of=largefile.iso bs=1M count=100 2>/dev/null

# 创建每卷20MB的分卷压缩
zip -s 20m -r split_archive.zip largefile.iso

# 查看生成的分卷文件
ls -lh split_archive.z*

# 解压分卷压缩(从第一个文件开始)
unzip split_archive.zip
示例8:压缩符号链接

处理符号链接的压缩:

# 创建文件和符号链接
echo "Original file" > original.txt
ln -s original.txt link.txt

# 默认压缩:保存链接指向的文件内容
zip default.zip original.txt link.txt

# 使用-y选项:保存链接本身而不是链接指向的文件
zip -y link_only.zip original.txt link.txt

# 查看两种方式的区别
unzip -l default.zip
unzip -l link_only.zip

高级用法

1. 批量压缩多个目录

使用脚本批量压缩多个目录:

#!/bin/bash
# 批量备份多个目录
BACKUP_DIRS=("/home/user/documents" "/var/www/html" "/etc/nginx")
BACKUP_PREFIX="backup_$(date +%Y%m%d_%H%M%S)"

for dir in "${BACKUP_DIRS[@]}"; do
    if [ -d "$dir" ]; then
        dirname=$(basename "$dir")
        zipfile="${BACKUP_PREFIX}_${dirname}.zip"
        echo "正在压缩: $dir"
        zip -rq "$zipfile" "$dir"
        echo "已创建: $zipfile"
    fi
done
2. 从标准输入读取文件列表
# 从find命令的结果创建ZIP文件
find . -name "*.txt" -type f -print | zip -@ textfiles.zip

# 从文件列表创建ZIP
cat filelist.txt | zip -@ selected_files.zip

# 结合grep过滤文件
find . -type f -name "*.py" | grep -v test | zip -@ source_files.zip
3. 自动删除源文件

压缩后自动删除原始文件(谨慎使用):

# 压缩并删除原始文件
zip -rm backup.zip /tmp/large_logs/

# 确认文件已被删除
ls -l /tmp/large_logs/ 2>/dev/null || echo "目录已被删除"
4. 创建自解压ZIP文件(Windows)

创建Windows可执行的自解压文件:

# 首先创建普通的ZIP文件
zip -r data.zip mydata/

# 下载并添加SFX模块(需要Windows SFX模块)
# 注意:这通常需要在Windows系统上完成,或使用wine
# zip -A data.zip  # 某些版本支持创建自解压文件
5. 跨平台换行符处理

处理Windows和Unix系统间的换行符差异:

# 将LF换行符转换为CRLF(用于Windows)
zip -l windows_files.zip *.txt

# 将CRLF换行符转换为LF(用于Unix)
zip -ll unix_files.zip *.txt

# 检查文件换行符
file *.txt

常见问题

  • zip:单个工具完成压缩,广泛跨平台支持,Windows原生支持,支持加密和分卷
  • tar+gzip:两个工具组合,Linux/Unix系统标准,保留所有文件属性(权限、链接等),通常用于系统备份
  • 使用场景:跨平台共享用zip,Linux系统备份用tar+gzip

确保使用UTF-8编码处理文件名:

  1. 设置环境变量:export LANG=en_US.UTF-8
  2. 使用最新版本的zip/unzip工具
  3. 对于解压,可以使用:unzip -O UTF-8 archive.zip
  4. 考虑使用7z工具,对UTF-8支持更好

# 排除版本控制目录
zip -r project.zip myproject/ -x "*.svn/*" ".git/*" ".gitignore"

# 或使用find命令排除
find myproject/ -type f ! -path "*/.svn/*" ! -path "*/.git/*" -print | zip -@ project.zip

  • 使用较低的压缩级别:zip -1zip -0(只打包不压缩)
  • 使用-q选项减少屏幕输出
  • 避免压缩已经压缩过的文件(如.jpg, .mp4, .zip等)
  • 使用更快的存储设备(SSD vs HDD)
  • 对于大量小文件,可以先使用tar打包再压缩

zip支持多种压缩算法,可以通过-Z选项指定:

  • store:不压缩(-Z store 或 -0)
  • deflate:默认算法,平衡压缩率和速度
  • bzip2:更高压缩率,但较慢(需要相应支持)
  • lzma:最高压缩率,但最慢(需要相应支持)
  • 查看支持的算法:zip -Z help

压缩算法对比

算法 zip选项 压缩率 速度 内存使用 兼容性
Store -0 或 -Z store 无压缩 最快 最低 最好
Deflate(默认) -6(默认) 中等 很好
Deflate(最大) -9 很好
BZIP2 -Z bzip2 很高 很慢 一般
LZMA -Z lzma 最高 最慢 很高 较差

实用技巧

  • 使用zip -T测试压缩文件完整性,确保备份可靠
  • 对于大量小文件,先使用tar打包再用zip压缩,可以提高压缩率
  • 使用zipnote命令可以编辑ZIP文件的注释
  • 创建备份时,在文件名中加入时间戳:backup_$(date +%Y%m%d).zip
  • 使用zip -v查看详细的压缩统计信息
  • 压缩时排除备份文件自身:zip -r backup.zip . -x "backup.zip"
  • 使用zipcloak命令可以加密现有的ZIP文件
  • 对于非常大的文件,考虑使用分卷压缩并验证每个分卷

相关命令

unzip

解压ZIP文件的工具

7z

7-Zip压缩工具,支持多种格式

tar

Linux标准归档工具

gzip

GNU压缩工具,常与tar配合使用