使用Makefile仅在修改后的文件上运行脚本

时间:2018-06-28 18:58:53

标签: makefile

我的目录中没有几个 val datetest:String="2018-02-01" df.filter(s"date='$datetest'").write.mode(SaveMode.Append).parquet(s"hdfs:/path..../$datetest") 文件。我只想对已修改的文件运行shell脚本。如何通过txt实现这一目标? 编写了以下部分,但是它将构建目录中的所有Makefile文件。对此有一些指导将是很棒的。

txt

1 个答案:

答案 0 :(得分:0)

我猜你想要这样的东西:

files := $(wildcard dir/txts/*/*.txt)
dummies := $(addprefix .mod_,$files)

all:$(dummies)

$(dummies): .mod_% : %
    sh build-txts.sh $^
    touch $@

对于任何新的文本文件,它将运行脚本,并创建一个.mod副本。对于任何非新文本文件,它将检查时间戳是否比.mod文件时间戳新。如果是,它将运行脚本,然后触摸.mod(使.mod比文本新)。对于自上次创建以来未修改的任何文本文件,.mod文件将更新,并且脚本将不会运行。请注意,.mod文件不是NOT PHONY目标。它们是虚拟文件,仅存在以标记上一次修改文本文件的时间。您也可以将它们粘贴在虚拟目录中,以方便清理。

如果您需要在默认情况下不希望在新的签出时重新生成文本文件的内容,或者您​​的脚本条件不是基于时间戳的,则需要一些技巧:

files := $(wildcard dir/txts/*/*.txt)
md5s:= $(addprefix .md5_,$files)

all:$(md5s)

.PHONY:$(md5s)
$(md5s):
    ( [ -e $@ ] && md5sum -c $@ ) || \
      ( sh build-txts.sh $@ && md5sum $(@:.md5_=) > $@ )

在这里,无论如何,您都对所有文本文件运行该规则,并使用bash确定文件是否过时。如果文本文件不存在,或者md5sum不正确,它将运行脚本,然后更新md5sum。由于规则是伪造的,因此它们始终对所有.md5sum文件运行,无论它们是否已经存在。

使用此方法,您可以将.md5文件提交到存储库,并且只会在结帐后md5总和发生变化的那些文件上运行脚本。