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

如何在GNU Makefile中生成带引号的逗号分隔列表

问题:Makefile中格式化文件路径输出需求

我编写了如下简单的Makefile:

MARKDOWNS = $(shell find . -type f -name "*.md" ! -name "index.md" ! -name "README.md")
all: list

list:
    echo $(MARKDOWNS)

我的目录下有以下.md文件:

$ ls *.md
foo.md bla.md ra.md

当前该Makefile的输出为:

./foo.md ./bla.md ./ra.md

但我期望的输出是:

"./foo.md", "./bla.md", "./ra.md"

我使用的是GNU Make 4.4.1,请问如何转换$(MARKDOWNS)以实现该需求?


解决方案

可以借助GNU Make的内置字符串处理函数或shell命令实现,以下是两种实用方法:

方法1:用Make内置函数处理

直接对变量做格式化转换,修改后的Makefile如下:

MARKDOWNS = $(shell find . -type f -name "*.md" ! -name "index.md" ! -name "README.md")
# 先给每个路径加引号,再替换分隔符为", "
FORMATTED_PATHS = "$(subst ", ", ", ",$(patsubst %,"%",$(MARKDOWNS)))"

all: list

list:
    echo $(FORMATTED_PATHS)
  • patsubst %,"%",$(MARKDOWNS):给每个文件路径前后添加双引号
  • subst ", ", ", ",...:把原本的空格分隔符替换成, (逗号加空格)
  • 最外层的双引号保证输出格式完全符合预期

方法2:借助shell命令处理

如果更习惯用shell工具,可修改list目标的执行语句:

MARKDOWNS = $(shell find . -type f -name "*.md" ! -name "index.md" ! -name "README.md")
all: list

list:
    printf '"%s", ' $(MARKDOWNS) | sed 's/, $//'
  • printf '"%s", ' $(MARKDOWNS):给每个路径加引号并以, 结尾
  • sed 's/, $//':移除最后多余的,

两种方法都能生成你需要的输出格式,可根据使用习惯选择。

内容的提问来源于stack exchange,提问作者somenxavier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:47:08