我有一个markdown文件的文件夹,这些文件正在使用Makefile转换为HTML文件。为了弄清楚源和目标,我使用以下Makefile构造
TARGETS_TO_BUILD := $(patsubst src/%.md, out/%.html, $(wildcard src/*.md src/**/*.md))
如果回显$(TARGETS_TO_BUILD),则会得到路径./out/index.html ./out/folder1/somepage.html
的列表,依此类推。工作良好。
但是,如果我开始将源文件放到越来越深的文件夹中,以致我得到一棵深树,那么事情就停止了。该通配符(src/**/*.md
)不起作用。我必须开始做这样的事情:
TARGETS_TO_BUILD := $(patsubst src/%.md, out/%.html, $(wildcard src/*.md src/**/*.md src/**/**/*.md src/**/**/**/*.md))
我必须继续添加越来越多的这些。
该glob字符串无法正常工作。我以为他们会无限深入地工作。
您误会了。 docs for wildcard support的语法非常清楚,没有列出**
。 **
是增强的通配符,POSIX glob(3)和fnmatch(3)函数(GNU用于实现glob的功能)不支持,并且POSIX sh不支持。实际上,bash
中甚至没有语法(默认情况下),这是大多数GNU / Linux和MacOS系统中的标准外壳。
在标准的glob语法中,*
和**
之间没有区别。实际上,***
,****
等与*
的含义相同:一次,两次或100次匹配零个或多个字符之间没有区别。
如果要无限递归,最简单的方法是通过find
函数的$(shell ...)
命令:
TARGETS_TO_BUILD := $(patsubst src/%.md, out/%.html, $(shell find src -name '*.md' -print))