2012-01-10 45 views
-3

对于令人困惑的标题,我很难描述问题。如何在bash中拆分目录名以在路径中的所有目录中进行递归调用

我提供给我两个值,第一个是恒定的,而第二个可以是任意数量的文件夹级别的

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 

这是在一个makefile中,所以使用gmake的函数是可以接受的。

请不要回答以重建我正在做的事情的建议。解释为什么我需要这个会花费太长时间。

+0

@downvoter:这个问题出了什么问题?帮助我改进它。 – 2012-04-24 20:52:34

回答

3

我不是高手gmake命令,这样我就可以提出一个方式如何实现,使用的外壳,可能是它可以帮助你实现,在GNU化妆...

BASE=application/classes 
FOLDERS=types/ads 

verifyDir $BASE 
NEWBASE=$BASE 
for c in `echo $FOLDERS | tr "/" " "`; do 
    NEWBASE="$NEWBASE/$c" 
    verifyDir $NEWBASE 
done 
1

安德鲁的建议是大。有人在工作中想出了另一种解决办法,所以我会把它放在这里作为参考,因为它使用不同的技术(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; 
+0

不错!我忘记了IFS。 – 4ndrew 2012-01-11 08:56:14

1

另一种解决方案,使用GNU使功能

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) 
相关问题