编写Makefile规则将同名目录下的嵌套文件移至顶层目录
没问题,我来帮你搞定这个Makefile的需求!刚好我之前也处理过类似的场景,下面直接给你可行的方案,再拆解说明每个部分的作用:
完整的Makefile代码
# 目标:将同名子目录下的文件移动到顶层目录 # 匹配所有子目录中符合「目录名/目录名.txt」格式的文件 SOURCE_FILES := $(wildcard */*.txt) # 将源文件路径转换为顶层目标文件名(比如把1234/1234.txt转为1234.txt) TARGET_FILES := $(patsubst %/%.txt, %.txt, $(SOURCE_FILES)) # 默认执行的目标:移动所有符合条件的文件 all: $(TARGET_FILES) # 规则:生成顶层的X.txt,依赖于X/X.txt,执行移动操作 %.txt: %/%.txt mv $< $@ # 可选:如果需要把文件移回原目录的clean目标 clean: @foreach file, $(TARGET_FILES), mv $(file) $(basename $(file))/$(file); \ done
代码拆解说明
SOURCE_FILES := $(wildcard */*.txt):用wildcard函数遍历所有子目录下的txt文件,拿到像1234/1234.txt、567/567.txt这样的路径列表。TARGET_FILES := $(patsubst %/%.txt, %.txt, $(SOURCE_FILES)):用patsubst做模式替换,把X/X.txt格式的路径转换成顶层的X.txt,这就是我们最终要生成的目标文件。%.txt: %/%.txt:这是一个模式规则,意思是要生成顶层的X.txt,必须依赖于子目录X里的X.txt文件。mv $< $@:$<代表规则里的依赖文件(也就是X/X.txt),$@代表目标文件(X.txt),这条命令就是把嵌套文件移到顶层。- 可选的
clean目标:如果之后需要把文件移回原目录,可以执行make clean,它会遍历所有已移动的文件,把它们放回对应的子目录。
注意事项
- 如果你的文件不止
.txt后缀,可以把wildcard里的*.txt改成*.*,但要确保子目录名和文件名(不含后缀)完全一致,比如abc/abc.pdf也能被正确处理。 - 如果子目录里有多个文件,只有符合「目录名+后缀」的文件会被移动,其他文件不受影响。
内容的提问来源于stack exchange,提问作者G_Hannigan
相关产品推荐
相关产品推荐

