2012-06-12 43 views
1

正在四处搜索,找不到此解决方案。我想我正在寻找一个名字的叶子目录。在这个例子中,我想获得一个名为“模块”的目录列表,它没有一个名为module的子目录。查找不包含特定目录的目录

modules/package1/modules/spackage1 
modules/package1/modules/spackage2 
modules/package1/modules/spackage3/modules 
modules/package1/modules/spackage3/modules/spackage1 
modules/package2/modules/ 

我的愿望列表将包含

modules/package1/modules/spackage3/modules/ 
modules/package2/modules/ 

所有的目录,没有一个名为模块子目录

我开始尝试一些本没有运气

find . -name modules \! -exec sh -c 'find -name modules' \; 
命名模块

-exec在退出代码上工作,好吧,让我们通过计数作为退出代码

find . -name modules -exec sh -c 'exit $(find {} -name modules|grep -n ""|tail -n1|cut -d: -f1)' \; 

这应该采取称为模块的每个子目录的计数,并退出它。没有这样的爱。

+1

您能否澄清您的示例所需列表,因为'modules/package1/modules/spackage1/modules /'不是您在示例结构中指定的目录。谢谢。 – beny23

+0

有趣的是,我刚刚注意到 'find。 -name modules -exec sh -c'exit 0'\;' 不会返回任何结果。基于手册页,我猜测0号出口会使得它和-exec语句不存在一样。 –

回答

0
find . -name modules |\ 
awk '{gooddir[$1]=1}\ 
END {\ 
    for(i in gooddir){\ 
     for(j in gooddir){\ 
      if(i!=j&&substr(i,0,length(j))==i)\ 
      {gooddir[i]=0;break}\ 
     }\ 
    }\ 
    for(i in gooddir){if(gooddir[i]==1){print i}}}' 

试试这个吗?

1

这假定GNU find。找到所有叶目录只包括一个出现的“模块”:

find -regex '.*/modules\(/.*\|$\)' \! -regex '.*/modules/.*/modules\(/.*\|$\)' -type d -links 2 
0

你开始

find . -name modules \! -exec sh -c 'find -name modules' \; 

并不坏,它只是需要一些改进。

find . -name modules \! -exec sh -c 'find {} -mindepth 1 -name modules|read' \; -print 
  • {}在发现modules目录搜索,而不是在顶级目录再次
  • -mindepth 1只搜索发现modules目录下,不要再发现自己
  • |read设置退出状态(不幸的是,找不到文件)
  • -print打印找到的目录