Linux下用zip压缩文件需先安装zip工具,压缩目录必须加-r选项,中文名需-U和-N=UTF8参数避免乱码,-x排除文件要注意路径匹配,且ZIP不保留Linux权限。

Linux下用zip命令压缩文件为ZIP格式,核心就一条:没装先装,有坑要绕,否则打出来的包可能解不开、乱码、缺文件或权限丢失。
zip命令不存在?先装再用
很多发行版(尤其是最小化安装的CentOS/RHEL或Docker镜像)默认不带zip。直接运行zip -v报command not found就说明没装。
- Ubuntu/Debian:
sudo apt update && sudo apt install zip unzip - CentOS 7 / RHEL 8+:
sudo yum install zip或sudo dnf install zip - Alpine(常见于容器):
apk add zip
别只装zip——顺手把unzip也装上,后续验证和解压都用得着。
压缩目录必须加 -r,否则包里只有空文件夹
zip archive.zip mydir/ 这条命令看似合理,但实际只会把mydir/这个目录名塞进去,里面所有文件一个都不在。这是新手踩得最多、最隐蔽的坑。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 正确写法:
zip -r archive.zip mydir/ - 想压缩当前目录下所有文件(不含子目录)?不用
-r,但极少这么用 - 路径末尾加不加
/不影响内容,但加了更明确表示是目录,避免误压同名文件
中文文件名乱码?看zip版本再决定加不加 -UN=UTF8
Linux上用zip打包含中文名的文件,Windows/macOS解压后常显示问号或方块。这不是系统locale问题,而是zip默认用CP437编码存文件名。
- 新版zip(≥3.0)支持:
zip -r -UN=UTF8 archive.zip mydir/ -
-U启用Unicode支持,-N=UTF8强制用UTF-8编码写入(注意必须大写UTF8,不能写utf-8) - CentOS 7自带的zip 3.0以下版本不识别
-UN,硬加会报错;此时只能靠解压端转码,不可靠
排除.git或__pycache__?-x参数要小心路径匹配
zip没有--exclude这种直观语法,全靠-x配合shell glob模式,而且匹配路径是相对你传入的源路径来的。
- 错误写法:
zip -r a.zip . -x "__pycache__/*"(假设当前目录就是项目根) - 正确写法:
zip -r a.zip . -x "*/__pycache__/*" ".git/*"—— 因为.下的__pycache__实际路径是./__pycache__/,所以模式得带*/ - 多个排除项用空格分隔,每个都得加引号:
-x "*.log" "*.tmp" -
-x后面不是正则,**无效,*只匹配一层
真正容易被忽略的是:ZIP格式本身不保存Linux文件权限(比如可执行位)。哪怕你压缩了一个deploy.sh,解压后它大概率没了x权限——部署脚本静默失败时,得回头检查这点。

















