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

如何仅用纯Make函数通配匹配指定目录下的文件?

仅用Make纯函数实现通配时只匹配文件的方案

问题背景

现有如下文件结构:

Makefile
dir1/
  file1
  file2
  dir2/
    file3

需要在不硬编码文件/目录名称、仅使用纯Make内置函数的前提下,获取dir1/下的file1和file2,且已知目录深度固定。

直接使用wildcard函数会同时匹配文件和目录,比如:

FILES_DEPTH1 = $(wildcard *)
FILES_DEPTH2 = $(wildcard */*)
FILES_DEPTH3 = $(wildcard */*/*)

展开后结果不符合预期:

FILES_DEPTH1 = Makefile         dir1
FILES_DEPTH2 = dir1/file1       dir1/file2      dir1/dir2
FILES_DEPTH3 = dir1/dir2/file3

纯Make函数解决方案

核心思路是先通过wildcard获取所有路径,再过滤掉其中的目录项:利用wildcard $(path)/判断路径是否为目录——如果是目录,该表达式会返回非空值;如果是文件则返回空。结合foreach和filter-out即可实现过滤。

针对深度2的文件匹配

# 获取所有深度2的路径(含文件和目录)
ALL_DEPTH2 = $(wildcard */*)
# 过滤掉目录项,仅保留文件
FILES_DEPTH2 = $(filter-out $(foreach item,$(ALL_DEPTH2),$(if $(wildcard $(item)/),$(item))),$(ALL_DEPTH2))

执行后FILES_DEPTH2会得到预期结果:dir1/file1 dir1/file2

通用化处理逻辑

对于任意已知深度的路径,都可以套用相同逻辑:

  1. 用wildcard获取对应深度的所有路径;
  2. 遍历路径列表,通过wildcard $(item)/识别目录;
  3. 用filter-out移除目录项,仅保留文件。

比如处理深度1的文件:

ALL_DEPTH1 = $(wildcard *)
FILES_DEPTH1 = $(filter-out $(foreach item,$(ALL_DEPTH1),$(if $(wildcard $(item)/),$(item))),$(ALL_DEPTH1))

执行后FILES_DEPTH1仅保留Makefile。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:40:22