zip命令是Linux系统中用于创建ZIP格式压缩文件的命令行工具。ZIP是一种广泛使用的压缩文件格式,具有跨平台兼容性,特别是在Windows、macOS和Linux系统之间共享文件时非常方便。
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工具。如果没有安装,可以使用以下命令:
sudo apt update
sudo apt install zip
sudo yum install zip
# 或使用dnf(Fedora/RHEL8+)
sudo dnf install zip
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
压缩单个或多个文件:
# 创建测试文件
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
使用递归选项压缩目录及其子目录:
# 创建测试目录结构
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
使用不同的压缩级别:
# 创建测试文件
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
创建需要密码才能解压的ZIP文件:
# 方法1:交互式输入密码
zip -e secret.zip file1.txt file2.txt
# 提示输入密码两次
# 方法2:命令行指定密码(不安全,密码可能被其他用户看到)
zip -P "MySecret123" secret2.zip file1.txt
# 测试解压加密文件
unzip -P "MySecret123" secret2.zip
压缩时排除某些文件或目录:
# 排除特定文件
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"
向现有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
创建大型文件的分卷压缩:
# 创建大型测试文件
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
处理符号链接的压缩:
# 创建文件和符号链接
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
使用脚本批量压缩多个目录:
#!/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
# 从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
压缩后自动删除原始文件(谨慎使用):
# 压缩并删除原始文件
zip -rm backup.zip /tmp/large_logs/
# 确认文件已被删除
ls -l /tmp/large_logs/ 2>/dev/null || echo "目录已被删除"
创建Windows可执行的自解压文件:
# 首先创建普通的ZIP文件
zip -r data.zip mydata/
# 下载并添加SFX模块(需要Windows SFX模块)
# 注意:这通常需要在Windows系统上完成,或使用wine
# zip -A data.zip # 某些版本支持创建自解压文件
处理Windows和Unix系统间的换行符差异:
# 将LF换行符转换为CRLF(用于Windows)
zip -l windows_files.zip *.txt
# 将CRLF换行符转换为LF(用于Unix)
zip -ll unix_files.zip *.txt
# 检查文件换行符
file *.txt
确保使用UTF-8编码处理文件名:
export LANG=en_US.UTF-8unzip -O UTF-8 archive.zip# 排除版本控制目录
zip -r project.zip myproject/ -x "*.svn/*" ".git/*" ".gitignore"
# 或使用find命令排除
find myproject/ -type f ! -path "*/.svn/*" ! -path "*/.git/*" -print | zip -@ project.zip
zip -1 或 zip -0(只打包不压缩)-q选项减少屏幕输出zip支持多种压缩算法,可以通过-Z选项指定:
zip -Z help| 算法 | zip选项 | 压缩率 | 速度 | 内存使用 | 兼容性 |
|---|---|---|---|---|---|
| Store | -0 或 -Z store | 无压缩 | 最快 | 最低 | 最好 |
| Deflate(默认) | -6(默认) | 中等 | 快 | 低 | 很好 |
| Deflate(最大) | -9 | 高 | 慢 | 低 | 很好 |
| BZIP2 | -Z bzip2 | 很高 | 很慢 | 高 | 一般 |
| LZMA | -Z lzma | 最高 | 最慢 | 很高 | 较差 |
zip -T测试压缩文件完整性,确保备份可靠zipnote命令可以编辑ZIP文件的注释backup_$(date +%Y%m%d).zipzip -v查看详细的压缩统计信息zip -r backup.zip . -x "backup.zip"zipcloak命令可以加密现有的ZIP文件解压ZIP文件的工具
7-Zip压缩工具,支持多种格式
Linux标准归档工具
GNU压缩工具,常与tar配合使用