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

Windows下Make递归查找所有子目录的实现方案

跨平台递归获取顶层目录下全部子目录的Make方案

原有UNIX环境下的find实现依赖系统自带的find命令,Windows默认cmd/PowerShell环境没有该命令,会直接执行失败。以下提供两种可正常运行的方案:


方案1:纯GNU Make内置实现(全平台兼容,推荐)

完全不依赖系统外部命令,仅用Make内置函数实现递归遍历,在Windows原生Make、Linux、macOS环境下均可正常运行,和原find命令返回结果完全一致。

# 定义递归遍历通配符函数
rwildcard = $(foreach entry,$(wildcard $(1:=/*)),$(call rwildcard,$(entry),$2) $(filter $(subst *,%,$2),$entry))

# 调用函数获取TOP_DIR下所有递归子目录
SUBDIRS := $(call rwildcard,$(TOP_DIR),*)

# 如果你需要把顶层目录本身也加入列表,追加下面一行即可
# SUBDIRS += $(TOP_DIR)

实现逻辑说明:

  • 逐层遍历指定路径下的所有条目,递归进入每一个子目录继续遍历
  • 最终筛选返回所有遍历到的目录路径,不需要调用任何shell外部命令,没有跨平台兼容问题

方案2:按系统分支调用对应系统命令

如果你更倾向于调用系统原生命令,可以通过Make内置的OS变量判断运行环境,分别适配不同系统的目录遍历命令:

ifeq ($(OS),Windows_NT)
    # Windows环境:用dir命令递归枚举所有目录
    SUBDIRS := $(shell dir /s /b /ad $(TOP_DIR))
else
    # 类UNIX环境:沿用原有find命令实现
    SUBDIRS := $(shell find $(TOP_DIR) -type d)
endif

注意事项:

  • Windows下dir命令参数:/s开启递归遍历,/b仅输出完整路径,/ad筛选类型为目录的条目
  • 该方案存在小概率兼容问题:如果Windows环境优先加载了MSYS2、Git Bash等类UNIX工具的shell,可能会出现命令参数不匹配的错误,稳定性弱于纯内置函数方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:18:33