我有一个像这样的目录树:
├── dir_a
│ └── file_1.txt
├── dir_b
│ └── dir_c
│ ├── file_2.txt
| └── file_3.txt
└── file_4.txt
我想镜像此目录结构以保存处理每个文本文件的命令的结果。即,输出如下所示:
├── build
│ ├── dir_a
│ │ └── processed_file_1.txt
│ ├── dir_b
│ │ └── dir_c
│ │ ├── processed_file_2.txt
│ | └── processed_file_3.txt
│ └── processed_file_4.txt
├── dir_a
│ └── file_1.txt
├── dir_b
│ └── dir_c
│ ├── file_2.txt
| └── file_3.txt
└── file_4.txt
我不太擅长 Makefile,所以我的问题是:如何获得 Makefile 来重新创建目录结构并递归处理所有文本文件以将它们放入构建目录中的正确位置?当输入文件发生变化时,我将重复运行此命令,因此不处理未更改文件的 Makefile 似乎是正确的方法。
更新: 我还应该提到,新的输入文件将被频繁添加,因此我不希望 Makefile 明确命名它们。
最佳答案
如果您使用具有不同后缀的词干而不是插入“processed_”字符串会更容易,但这里有一个适合我的示例:
OUTPUTS := build/dir_a/processed_file_1.txt \
build/dir_b/dir_c/processed_file_2.txt \
build/dir_b/dir_c/processed_file_3.txt \
build/processed_file_4.txt
all: $(OUTPUTS)
.SECONDEXPANSION:
$(OUTPUTS): build/% : $$(subst processed_file_,file_,%)
mkdir -p $(dir $@)
cp $< $@
clean:
rm -rf build
您可以通过更改文件名的末尾而不是开头来消除 .SECONDEXPANSION
的复杂性:
OUTPUTS := build/dir_a/file_1.out \
build/dir_b/dir_c/file_2.out \
build/dir_b/dir_c/file_3.out \
build/file_4.out
all: $(OUTPUTS)
$(OUTPUTS) : build/%.out : %.txt
mkdir -p $(dir $@)
cp $< $@
clean:
rm -rf build
关于makefile - 重新创建目录结构并使用 gnu make 递归处理每个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348903/