Команда shell find: смешивание исключая каталоги и включая определенные каталоги - PullRequest
0 голосов
/ 20 сентября 2018

Я столкнулся с такой структурой каталогов, как:

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

Вместо того, чтобы каждый модуль определял свой собственный каталог для поиска.Я хочу найти все соответствующие каталоги с помощью «простой» команды оболочки и использовать ее в моем файле сборки верхнего уровня.

Это выглядело бы намного лучше и в качестве бонуса заставляло бы других пользователей использовать папки, определенные в рекомендациях по кодированию.

Я дошел до:

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 голосов
/ 20 сентября 2018

Найти нужные подкаталоги с помощью 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))
0 голосов
/ 20 сентября 2018

Если я правильно понимаю ваш вопрос, просто не ограничивайтесь только тремя конкретными папками.Уберите

\( -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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...