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

如何仅在文件缺失或下载URL变更时通过Makefile下载文件?

Makefile实现按需下载(文件缺失/URL变更时触发)

核心思路是用一个戳记文件记录当前使用的下载URL,通过对比戳记内容和当前URL,结合目标文件是否存在,来决定是否重新下载。

完整实现代码

# 自定义配置:替换成你的目标文件和下载地址
TARGET_FILE := my_file.tar.gz
DOWNLOAD_URL := https://example.com/resources/my_file.tar.gz

# 自动生成戳记文件名,和目标文件绑定
URL_STAMP := $(TARGET_FILE).url.stamp

# 默认执行目标
all: $(TARGET_FILE)

# 目标文件依赖戳记文件——戳记更新则重新下载
$(TARGET_FILE): $(URL_STAMP)
	# 这里可以替换成curl:curl -o $@ $(DOWNLOAD_URL)
	wget -O $@ $(DOWNLOAD_URL)

# 戳记文件规则:检查URL是否变化,变化则更新戳记
$(URL_STAMP):
	@if [ ! -f $@ ] || [ "$$(cat $@)" != "$(DOWNLOAD_URL)" ]; then \
		echo "$(DOWNLOAD_URL)" > $@; \
	fi

# 清理生成的文件
clean:
	rm -f $(TARGET_FILE) $(URL_STAMP)

逻辑说明

  1. 戳记文件的作用:$(URL_STAMP) 保存当前生效的下载URL,每次Make执行时都会检查它
  2. 触发下载的条件:
    • 目标文件$(TARGET_FILE)不存在
    • 戳记文件不存在(首次执行)
    • 戳记文件里的URL和DOWNLOAD_URL不一致(URL更新)
  3. 自动更新戳记:当URL变化时,戳记文件会被重新写入新的URL,触发后续的下载动作

可选优化

  • 如果需要校验文件完整性,可以把文件哈希值也加入戳记文件,比如:
    # 新增哈希校验
    EXPECTED_HASH := "abc123def456..."
    $(URL_STAMP):
    	@if [ ! -f $@ ] || [ "$$(head -n1 $@)" != "$(DOWNLOAD_URL)" ] || [ "$$(tail -n1 $@)" != "$(EXPECTED_HASH)" ]; then \
    		echo "$(DOWNLOAD_URL)" > $@; \
    		echo "$(EXPECTED_HASH)" >> $@; \
    	fi
    
    $(TARGET_FILE): $(URL_STAMP)
    	wget -O $@ $(DOWNLOAD_URL)
    	echo "$(EXPECTED_HASH) $@" | md5sum -c -
    
  • 替换下载工具:把wget换成curl只需修改下载命令即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:07:39