You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:20:18