【问题标题】:How to use makefile to trigger data processing when input files changed?输入文件更改时如何使用makefile触发数据处理?
【发布时间】:2019-04-19 13:07:25
【问题描述】:

我希望在启动 make 时执行数据处理,并且输入目录中的一个或多个文件已更改。使用我当前的 Makefile 处理不会触发。

假设我正在建立一个示例项目:两个目录,一个包含数据文件。使用这个脚本:

#!/bin/bash

mkdir -p proj/input
mkdir -p proj/output
cd proj/input
echo "a2018" > 2018a.txt
echo "b2018" > 2018b.txt

echo "a2019" > 2019a.txt
echo "b2019" > 2019b.txt

我的 Makefile:

#proj/Makefile

RAW := $(shell find input -name "*.txt")
OUT := ./output

.PHONY: all

all: $(OUT)/*.txt
    echo "Running processing of raw files"

$(OUT)/2018merged.txt: $(RAW)
    ./merge.sh 2018

$(OUT)/2019merged.txt: $(RAW)
    ./merge.sh 2019 

合并脚本根据文件名按年份对文件进行基本连接,并将结果保存在输出目录的文件中。

#!/bin/bash
# proj/merge.sh

echo "-- merging files for $1"
cat input/$1*.txt > "./output/$1merged.txt"

我相信提供输入目录中的所有文件作为先决条件就足够了,但显然我做错了。 我发现关于类似问题的问题很少,并且可能存在部分解决方案:

【问题讨论】:

    标签: bash makefile data-science


    【解决方案1】:

    考虑这条规则:

    all: $(OUT)/*.txt
            echo "Running processing of raw files"
    

    这表示,all 取决于 $(OUT) 目录中与模式 *.txt 匹配的所有文件。

    当然,在你运行你的makefile之前没有文件:这就是你的makefile创建它们的全部意义所在。因此,当您第一次运行 make 时,该模式扩展为空,因此 all 没有先决条件,因此什么也不做。

    如果您想构建要构建的目标列表,则必须基于始终存在的 source 文件进行构建,或者在这种情况下它们与您不完全匹配必须明确列出它们:

    YEARS = 2018 2019
    
    all: $(patsubst %,$(OUT)/%.txt,$(YEARS))
            echo "Running processing of raw files"
    

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 2019-12-28
      相关资源
      最近更新 更多