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

如何在Makefile中实现Bash的{a,b,c}通配符等效操作?

在Makefile中实现rm -f {a,b,c}_foo/*.csv的等效操作

问题出在Make默认使用POSIX标准的/bin/sh作为shell,而bash独有的大括号扩展(brace expansion)在sh里是不支持的——直接写{a,b,c}_foo/*.csv会被sh当成一个完整的文件名去匹配,自然找不到对应文件。

下面给你几个实用的解决办法:

方法1:让Make用bash执行命令

在Makefile开头显式指定shell为bash,这样就能直接用你熟悉的大括号语法了:

# 强制使用bash替代默认的sh
SHELL := /bin/bash

clean:
	rm -f {a,b,c}_foo/*.csv

方法2:用Make的wildcard函数生成文件列表

如果不想依赖bash,用Make自带的wildcard函数来匹配文件是更通用的方案,它会自动扫描符合模式的文件并生成列表:

clean:
	rm -f $(wildcard a_foo/*.csv b_foo/*.csv c_foo/*.csv)

这个方法的好处是:如果某个目录下没有.csv文件,wildcard会返回空字符串,不会让rm抛出“找不到文件”的警告(即使加了-f,bash的大括号扩展在无匹配时还是会有警告)。

方法3:用foreach批量处理目录(适合目录有规律的场景)

如果你的目录名是有规律的(比如都是[字母]_foo),可以先定义目录前缀变量,再用foreach循环生成所有匹配路径:

# 定义需要处理的目录前缀
DIR_PREFIXES := a b c

clean:
	rm -f $(foreach prefix,$(DIR_PREFIXES),$(wildcard $(prefix)_foo/*.csv))

后续要新增目录的话,只需要修改DIR_PREFIXES变量就行,维护起来更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:05:50