shell find命令:混合排除目录和包括特定目录

时间:2018-09-20 07:47:15

标签: shell makefile find

我面临的目录结构是:

./xxx/src
./xxx/src/folder1
./xxx/src/folder2
./xxx/src/folder2/subfolder1
./xxx/UTest
./xxx/Module
./xxx/Itfs
./.hg
./Tools

不是让每个模块定义它自己的包含搜索目录。我想使用“简单” shell命令找到所有相关目录,并在我的顶层makefile中使用它。

这看起来好多了,而且作为奖励,它迫使其他用户使用编码准则中定义的文件夹。

我到了:

MODINCLUDES = \
$(shell find $(MODULE_DIR) \( -name .hg -o -name Tools \) -prune -o \( -name src -o -name Module -o -name Itfs  \) -type d -print| while read line; do echo "-I$$line"; done )

但这会导致

MODINCLUDES = -I/xxx/src -I/xxx/Module -I/xxx/Itfs

很显然,我也希望在src中包含所有子文件夹。

./xxx/src/folder1
./xxx/src/folder2
./xxx/src/folder2/subfolder1

有人可以向我解释如何执行此操作吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,请不要仅局限于三个特定的文件夹。取出

\( -name src -o -name Module -o -name Itfs  \)

如果您的while支持find,也许可以避免愚蠢的-printf循环:

MODINCLUDES = \
$(shell find $(MODULE_DIR) \
    \( -name .hg -o -name Tools \) -prune -o \
    -type d -printf "-I%p\n")

答案 1 :(得分:0)

使用find查找所需的子目录可以通过以下方式完成:

find $(MODULE_DIR)/xxx/src $(MODULE_DIR)/xxx/Module $(MODULE_DIR)/xxx/Itfs -type d

然后,将其放入Makefile中并添加-I前缀:

ROOTDIRS    := $(addprefix $(MODULE_DIR)/xxx/,src Module Itfs)
SUBDIRS     := $(shell find $(ROOTDIRS) -type d)
MODINCLUDES := $(addprefix -I,$(SUBDIRS))

或者一次全部:

MODINCLUDES := $(addprefix -I,$(shell find $(addprefix $(MODULE_DIR)/xxx/,src Module Itfs) -type d))