如何使用GNU Make获取文件夹列表,构建递归Makefile处理Markdown文件
递归Makefile实现多级文件夹Markdown转HTML
核心思路
无需为每个文件夹单独编写Makefile,一个顶层Makefile即可完成所有逻辑:利用Make的递归特性自动遍历子文件夹,非叶子节点继续向下递归,叶子节点执行pandoc转换命令。
实现方案
方案1:分层递归(适配多级文件夹结构)
顶层Makefile(放在notes根目录)
# 获取当前目录下所有非隐藏子文件夹 SUBDIRS := $(filter-out .*/, $(wildcard */)) # 默认目标:递归处理所有子文件夹 all: $(SUBDIRS) # 进入子文件夹执行make命令 $(SUBDIRS): @$(MAKE) -C $@ .PHONY: all $(SUBDIRS)
子文件夹Makefile(非叶子/叶子通用)
在所有topic、sub-topic文件夹下放置同一套Makefile:
# 获取当前目录子文件夹 SUBDIRS := $(filter-out .*/, $(wildcard */)) # 获取当前目录所有Markdown文件 MD_FILES := $(wildcard *.md) # 生成对应的HTML目标 HTML_FILES := $(MD_FILES:.md=.html) # 优先递归子文件夹,再处理当前目录的MD文件 all: $(SUBDIRS) $(HTML_FILES) # 递归调用子文件夹make $(SUBDIRS): @$(MAKE) -C $@ # pandoc转换规则:MD转HTML %.html: %.md pandoc -s $< -o $@ .PHONY: all $(SUBDIRS)
方案2:单文件全搞定(更简洁)
如果不想在每个文件夹放Makefile,直接用一个顶层Makefile递归查找所有MD文件:
# 递归查找所有非隐藏的Markdown文件 MD_FILES := $(shell find . -type f -name "*.md" ! -path "*/.*/*") # 生成对应的HTML文件路径 HTML_FILES := $(MD_FILES:.md=.html) # 默认目标:生成所有HTML all: $(HTML_FILES) # pandoc转换规则,自动适配文件路径 %.html: %.md pandoc -s $< -o $@ .PHONY: all
关键命令说明
$(wildcard */):获取当前目录下所有子文件夹(带斜杠)$(filter-out .*/, ...):排除隐藏文件夹$(MAKE) -C $@:进入指定子文件夹执行make命令find . -type f -name "*.md":递归查找所有Markdown文件$(MD_FILES:.md=.html):批量将.md后缀替换为.html
使用方式
在notes根目录下直接运行make,即可自动遍历所有层级文件夹,完成Markdown到HTML的转换。
内容的提问来源于stack exchange,提问作者draikes
相关产品推荐
相关产品推荐

