登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  软件教程

7-Zip 命令行怎么排除目录并生成可复现压缩包

来源:17golang原创

时间:2026-11-11 05:11:03 174浏览 收藏

用 7-Zip 打包项目时,真正容易出错的不是压缩格式,而是每次把哪些目录放进了包。把工作目录、输出格式和排除规则写死,再用 7z l 与 7z t 检查结果,就能让构建脚本稳定地产出同一类文件集合。

官方地址:https://www.7-zip.org/

要点速览
  • -xr! 用于递归排除目录,规则要写成相对归档根目录可解释的路径。
  • 需要更严格的输入集合时,用 UTF-8 路径清单代替宽泛的当前目录匹配。
  • “可复现”先保证输入集合和参数稳定;如果要求字节级一致,还要额外统一文件时间等元数据。

先固定归档根目录和输出格式

7z 格式支持 Unicode 文件名和较高压缩比,适合保存构建产物或项目快照。命令脚本不要从任意当前目录运行,否则同一条相对路径可能指向不同内容。下面的示例假设命令从项目根目录执行,并把输出文件放到根目录之外的固定位置。

# 进入固定的项目根目录,避免相对路径随调用位置变化
cd /work/demo-app

# 固定 7z 格式和压缩参数;-ms=off 让文件集合边界更直观
7z a -t7z -mx=5 -ms=off -mmt=off ../artifacts/demo-app.7z . \
  -xr!.git \
  -xr!node_modules \
  -xr!dist

这里的 a 是添加到归档,-t7z 固定输出格式,-mx=5 是一个偏平衡的压缩等级。-ms=off 关闭固实压缩,便于按文件边界处理;-mmt=off 则把多线程设置固定下来。它们能减少脚本环境差异,但不等于自动消除文件时间等元数据差异。

7-Zip 归档根目录、7z 输出格式、递归排除目录和命令预览的原创界面说明图
图1:参数配置说明图,展示归档根目录、7z 格式和 -xr! 排除规则的对应关系,不是运行截图。

用 -xr! 递归排除目录,避免通配范围漂移

-xr! 可以把匹配目录及其下级内容一起排除。规则写得越具体,越容易复查:缓存目录、依赖目录和构建目录各占一行,不要把一个含义不清的宽泛通配符塞进脚本。

# 递归排除三个不应进入发布包的目录
7z a release.7z . \
  -xr!.git \
  -xr!node_modules \
  -xr!dist

# 使用 * 匹配所有文件;不要把 *.* 当成“所有文件”的通用写法
7z a source.7z src config README.md -xr!src/cache

如果项目中存在同名目录,建议把规则写成更明确的相对路径,例如 -xr!./packages/demo/node_modules。官方 FAQ 还特别提醒,7-Zip 的 *.* 并不等同于操作系统里“任意文件”的直觉写法;脚本中宁可直接指定目录或使用 *,也不要依赖模糊匹配。

用 UTF-8 路径列表收敛输入集合

当归档内容需要经过评审、跨机器复用,或者目录层级经常变化时,可以把要收录的路径单独写成清单。清单文件本身就是可审计的输入,脚本只负责固定格式和输出位置。

# archive-files.txt 使用 UTF-8,每行写一个相对项目根目录的路径
cat > archive-files.txt 

路径列表适合明确“收录什么”,而 -xr! 适合明确“排除什么”。两者不要混成一套无法解释的规则:先选一个主策略,再在脚本旁边保留清单或排除项的变更记录。若目标是字节级完全相同的归档,还需在进入 7-Zip 前统一文件时间、路径排序和其他元数据;本文只把可复现限定为文件集合与命令参数可重复。

用 7z l 和 7z t 验收归档

生成文件后先列内容,再做完整性测试。l 解决“收录了什么”,t 解决“归档能否被完整读取”。这两个检查点应保留在脚本日志中,发现 .git 或 node_modules 仍然出现时,回到排除规则修正,而不是手工删除压缩包内的条目。

# 先列出归档内容,确认源码在、缓存和依赖不在
7z l release.7z

# 再测试归档完整性;非零退出码应让构建任务失败
7z t release.7z
test "$?" -eq 0 || { echo "归档测试失败"; exit 1; }
7-Zip 归档内容清单、已排除目录和无错误完整性测试的原创界面说明图
图2:结果验收说明图,展示归档内容清单、排除目录和完整性测试状态,不是运行截图。
验收项预期状态异常处理
源码和配置出现在 7z l 清单补充路径或检查工作目录
缓存和依赖不出现在清单收紧 -xr! 规则
完整性测试7z t 返回 0保留错误输出并重新生成

常见问题

为什么排除了 node_modules,包里仍然有它?

通常是工作目录、目录层级或规则写法不一致。先用 7z l 看归档内的实际相对路径,再把 -xr! 改成与该路径一致的规则。

固定 -mmt=off 就能保证两个压缩包完全相同吗?

不能。它只固定了一个压缩参数;文件修改时间、路径顺序和 7-Zip 版本等元数据仍可能影响字节结果。若只要求每次包含相同文件,固定根目录、清单和排除规则通常更重要。

应该使用排除规则还是路径清单?

项目结构稳定、排除项少时用 -xr! 更简洁;需要审计收录范围或跨机器复用时,用 UTF-8 路径清单更容易评审。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>