编写Makefile压缩目录后重命名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

