【问题标题】:Downloading files with Makefile rules使用 Makefile 规则下载文件
【发布时间】:2010-02-13 17:44:12
【问题描述】:

我正在计划这样的事情:

URLS=www.host.com/file1.tar.gz www.host2.com/file2.tar.gz
$(somefunc $URLS): #somefunc produces downloads/file1.tar.gz downloads/file2.tar.gz
   mkdir -P downloads
   wget whatever # I can't get the real url here because the targets don't contain the full url anymore

myproject: $(somefunc URLS)
   #Files should already be in downloads/ here

我遇到的问题是,如果我用 somefunc 转换 URL,我会丢失 url,否则我不能将它用作目标,以避免在它已经存在时被下载。

有什么想法吗?

【问题讨论】:

    标签: linux download makefile wget


    【解决方案1】:

    如果somefunc 只修改了路径,而不是实际的文件名,并且没有重复,您可以尝试在$(URLS) 中搜索原始文件名。

    也许是这样的? (未经测试)

    $(somefunc $URLS): #somefunc produces downloads/file1.tar.gz downloads/file2.tar.gz
       mkdir -p $(dir $@)
       wget $(filter $(addprefix %/,$(notdir $@)),$(URLS)) -O $@
    
    • 对于其中一个目标,$(notdir $@) 的计算结果为 file1.tar.gz
    • $(addprefix %/,file1.tar.gz) 评估为 %/file1.tar.gz
    • $(filter %/file1.tar.gz,www.host.com/file1.tar.gz www.host2.com/file2.tar.gz) 计算结果为 www.host.com/file1.tar.gz

    (大概你也想要一个http://?)

    【讨论】:

      【解决方案2】:

      在这一点上,我认为你不能直接用 make 来做。但如果您愿意使用一些脚本,这里有一个解决方案:

      $(URLS):
          @for url in ${URLS}; do \                                               
              if [ ! -e $$(somefunc $${url}) ]; then \
                  echo wget $${url}; \
                  wget $${url}; \
              fi \
          done
      

      【讨论】:

      • 但是每次缺少一个目标时都会下载所有 URL。我正在考虑使用 Makefile 解决方案,而不是依靠 wget 同时下载多个 URL。
      • @Yogur - 好的,我已经彻底修改了我的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多