查找不包含特定目录的目录

时间:2012-06-12 08:03:43

标签: bash shell command-line find

一直在寻找一下,找不到这个解决方案。我想我正在寻找一个名字的叶子目录。在这个例子中,我想得到一个目录列表,呼叫' modules'没有名为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/

所有名为module的目录都没有名为module

的子目录

我开始尝试这个没有运气的东西

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)' \;

这应该取名为modules的每个子目录的计数并随之退出。没有这样的爱。

3 个答案:

答案 0 :(得分:1)

这假设为GNU find。查找仅包含一次“模块”的所有叶子目录:

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

答案 1 :(得分: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}}}'

试试这个吗?

答案 2 :(得分:0)

你的开始

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

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

find . -name modules \! -exec sh -c 'find {} -mindepth 1 -name modules|read' \; -print
  • {}搜索找到的模块目录,而不是在顶层目录中搜索
  • -mindepth 1仅在找到的模块目录下搜索,而不是再次找到自己
  • 如果没有找到文件,
  • |read设置退出状态(不幸的是,发现不会这样做)
  • -print打印找到的目录