Как разделить имена каталогов в Bash, чтобы сделать рекурсивный вызов во всех каталогах в пути - PullRequest
0 голосов
/ 11 января 2012

Извините за запутанный заголовок, мне было трудно описать проблему.

У меня есть два значения, первое из которых является константой, а второе может быть любым количеством уровней папок

BASE = application/classes
FOLDERS = types/ads

Исходя из этого, мне нужно запустить команды, подобные следующим (в таком порядке):

verifyDir application/classes
verifyDir application/classes/types
verifyDir application/classes/types/ads

Я также мог бы просто передать все каталоги в verifyDir, если это проще

verifyDir application/classes application/classes/types application/classes/types/ads

Это внутри make-файла, поэтому использование функций gmake приемлемо.

Пожалуйста, не отвечайте с предложением реструктурировать то, что я делаю. Потребовалось бы слишком много времени, чтобы объяснить, зачем мне это нужно.

Ответы [ 3 ]

3 голосов
/ 11 января 2012

Я не мастер gmake, поэтому я могу просто предложить способ достижения этого с помощью оболочки, может быть, это поможет вам добиться этого в GNU Make ...

BASE=application/classes
FOLDERS=types/ads

verifyDir $BASE
NEWBASE=$BASE
for c in `echo $FOLDERS | tr "/" " "`; do
    NEWBASE="$NEWBASE/$c"
    verifyDir $NEWBASE
done
1 голос
/ 12 января 2012

Другое решение, использующее GNU make функции

BASE = application/classes
FOLDERS = types/ads/more/hierarchy/here

FOLDERS_SPLIT := $(subst /, ,$(FOLDERS))
FOLDERS_ITER :=

FOLDERS_TREE := $(foreach FOLDER, $(FOLDERS_SPLIT), $(eval FOLDERS_ITER := $(FOLDERS_ITER)/$(FOLDER)) $(BASE)$(FOLDERS_ITER))

all:
    @echo FOLDERS_TREE $(FOLDERS_TREE)
1 голос
/ 11 января 2012

Эндрю предлагает замечательно.Кто-то на работе придумал другое решение, поэтому я приведу его здесь для справки, поскольку он использует другой метод (IFS, который изменяет разделитель слов по умолчанию)

BASE="some/base/dir" 
TAIL="fold1/fold2/fold3" 
ALLPATHS="$BASE"
IFS=/
for X in $TAIL; do
    ALLPATHS="$ALLPATHS $ALLPATHS/$X";
done; 
unset IFS; 
verifyDir $ALLPATHS;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...