You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Makefile压缩目录后重命名Zip,如何保留解压原始目录名?

解决压缩后重命名zip文件,解压目录名不符的问题

我懂你遇到的麻烦了——单纯重命名zip文件只是改了个外壳文件名,完全不会改动zip包内部存储的目录结构,所以不管你手动改还是用mv命令,解压出来依然是原来的public_html目录。之前试的git archive --prefix只针对git仓库的归档场景,要是你不是从git仓库导出内容就没用;而zip -j是直接丢弃所有路径,会把所有文件平铺出来,显然不是你想要的带外层目录的效果。

这里给你几个在Makefile里实现需求的可靠方案:

方案1:用zip的--transform参数直接修改内部路径

这是最直接高效的方法,zip的--transform(简写-T)参数能在压缩时批量修改归档内的文件名/路径。你只需要把原来的public_html路径替换成test-1.0就行:

test-1.0.zip:
	zip -r $@ public_html/ --transform 's/public_html/test-1.0/'

执行这个Makefile目标后,生成的test-1.0.zip里所有文件的路径都会从public_html/xxx变成test-1.0/xxx,解压后自然就得到test-1.0目录。

方案2:先创建临时目录再压缩(兼容性更强)

要是担心不同系统的zip版本对--transform支持不一致,还可以用这种更通用的方式:先临时创建test-1.0目录,把public_html的内容复制进去,压缩完成后再清理临时目录:

test-1.0.zip:
	@mkdir -p test-1.0
	@cp -a public_html/* test-1.0/
	zip -r $@ test-1.0/
	@rm -rf test-1.0

加@是让这些命令不在终端输出冗余信息,保持整洁;cp -a是归档模式,能保留文件的权限、符号链接等属性,比普通cp更稳妥。

方案3:用tar先打包再转zip(适合熟悉tar的场景)

tar的--prefix参数本来就很适合给归档文件加统一前缀,我们可以先通过tar生成带test-1.0前缀的归档,再转成zip格式:

test-1.0.zip:
	tar -czf - public_html/ --transform 's/public_html/test-1.0/' | zip $@ -

这里tar -czf -表示把归档内容输出到标准输出,再通过管道传给zip $@ -,让zip从标准输入读取内容生成最终的zip文件。

这三个方案都能完美解决你的问题,选哪个看你自己的使用习惯和系统环境~

内容的提问来源于stack exchange,提问作者lastlink

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:58:56