Linux下ZIP不保存权限,因格式标准本身不记录uid/gid、执行位等;应改用tar+gzip或解压后手动chmod。

Linux 下用 zip 打包的文件,传到 Windows 解压后权限“丢失”,其实不是真丢了——而是根本没存进去。因为 ZIP 格式标准本身不记录 Linux 的 uid/gid、执行位(x)、粘滞位等权限信息。Windows 解压工具自然无法还原,连尝试都不做。这不是兼容性问题,是格式限制。
真正能保留权限的替代方案
如果目标是让 Linux 文件在跨平台传输后仍保持可执行、所属用户/组等属性,就别依赖 ZIP:
-
用 tar + gzip/bzip2:比如
tar -czf archive.tar.gz project/。tar 归档原生保留所有权限和所有权(只要解压方有足够权限),且现代 Windows 工具(如 7-Zip、WinRAR、WSL 内置 tar)都能正常解压。 -
用 zip 但加 -X 参数(有限尝试):运行
zip -r -X archive.zip project/。它会尝试把扩展属性(如 ACL、UID/GID)写入 ZIP 的 extra field 字段,但绝大多数 Windows 解压器完全忽略这些字段,只有极少数专业工具(如 Info-ZIP 自家的 unzip)可能读取。实用性很低,不推荐作为主力方案。 -
传输前先 chmod +x,再打包:虽然 ZIP 不记权限,但你可以确保关键脚本在打包前已有执行权。解压后手动
chmod +x *.sh或写个简单恢复脚本,比指望 ZIP 记住更可靠。
为什么不能靠 unzip 恢复权限?
即便你在 Linux 上用 unzip -X 解压一个带扩展属性的 ZIP,也只对极少数由 Info-ZIP 创建、且含完整 extra field 的包有效。而 Windows 打包的 ZIP 几乎从不写这些字段;反过来,Linux 打的 ZIP 即使写了,Windows 解压器也不认。所以不要把权限恢复寄托在解压命令上。
部署场景下的实用建议
如果你在写部署脚本或分发软件包:
- 明确要求接收方用
tar -xzf解压,而不是双击 ZIP —— 这是最稳妥的跨平台权限保留方式; - 在压缩包里附一个
setup.sh或install.sh,开头就包含chmod +x *.sh && chmod 755 bin/*等权限修复逻辑; - 避免依赖“解压即可用”,改为“解压 + 显式授权”两步流程,逻辑清晰、行为可控。
归根结底,ZIP 是为通用交换设计的,不是为 Unix 权限建模的。想保权限,就得换归档格式或补授权动作。


















