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

编写Makefile批量压缩当前目录子目录遇问题求助

解决Makefile批量生成所有子目录压缩包的问题

我看了你的Makefile代码,问题出在默认目标的选择上——当你直接运行make时,Make会默认执行文件中定义的第一个目标,也就是$(ZIPS)展开后的第一个.zip文件,所以只会生成第一个子目录的压缩包。我们只需要调整默认目标,再优化下压缩命令,就能实现批量生成所有子目录的压缩包了。

修复后的Makefile代码

# 将dist设为默认目标,直接运行make就会执行该目标
.DEFAULT_GOAL := dist

# 获取当前目录下所有子目录(带末尾斜杠)
SUBDIRS := $(wildcard */)
# 将子目录名去掉斜杠,加上.zip后缀,生成压缩包文件名列表
ZIPS := $(addsuffix .zip,$(subst /,,$(SUBDIRS)))

# 模式规则:每个%.zip依赖对应的子目录%(仅检查目录是否存在,不依赖目录内容变化)
$(ZIPS) : %.zip : | %
	# 使用-r参数递归压缩子目录下的所有内容(包括嵌套子目录)
	zip -r $@ $*

# 批量生成所有压缩包的目标
dist: $(ZIPS)

关键改动说明

  1. 设置默认目标:添加.DEFAULT_GOAL := dist,让dist成为Make默认执行的目标,这样直接运行make就会触发所有压缩包的构建,无需显式指定make dist。
  2. 优化zip命令:把zip $@ $*/*改成zip -r $@ $*,加上-r参数可以递归压缩子目录下的所有内容(包括嵌套的子目录和文件),原来的写法只会压缩子目录下的直接文件,漏掉嵌套目录。
  3. 简化压缩路径:用$*代替$*/*,直接指定子目录名,让zip递归处理整个子目录,更简洁可靠。

额外扩展(可选)

如果需要清理生成的压缩包,可以添加一个clean目标:

clean:
	rm -f $(ZIPS)

运行make clean就能一键删除所有生成的.zip文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:08:58