【发布时间】:2021-06-02 09:47:21
【问题描述】:
在顶层(unix,GNU)Makefile 中,我想遍历子目录列表并在其中执行任务,但排除其中的一些。在这种情况下,排除所有以下划线 (_) 开头的子目录
以下内容正在迭代,但忽略了排除正则表达式。它仍然访问目录“_exclude”。
特别是我认为它忽略了“字符串的开头” ^ (或者它从字面上理解)。我尝试过其他正则表达式,它们确实有效。知道如何解决吗?或者,如果您确实知道如何消除脱壳或不使用 GNU makefile 扩展?
SHELL=/bin/bash
EXCLUDE_DIRS_REGEX=^_
# later addition:
ALLMAKEFILES = $(shell find . -maxdepth 2 -type f -name Makefile)
SUBDIRS = $(filter-out ./,$(dir $(ALLMAKEFILES)))
all:
for dir in $(SUBDIRS); do \
if [[ "$$dir" =~ $(EXCLUDE_DIRS_REGEX) ]]; then continue; fi; \
make -C $$dir all; \
done
【问题讨论】:
-
如果
SUBDIRS是一个变量,试试$(foreach d,$(SUBDIRS),$(patsubst _%,,$(d))) -
@tripleee 好主意,谢谢。我过于关注外壳部分。我已经修改了我的帖子以显示
SUBDIRS的来源。 -
ALLMAKEFILES = $(shell find . -maxdepth 2 -not -path '*/_*' -type f -name Makefile)在find期间进行过滤并且运行良好。谢谢@tripleee -
您的正则表达式匹配以下划线开头的字符串,当然
find的结果都不会。(^_|/_)将匹配并在开头或斜线后立即添加下划线。 -
哦,谢谢!现在我明白为什么 bash 正则表达式不起作用了!