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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:06:00