Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 查找不包含特定目录的目录_Bash_Shell_Command Line_Find - Fatal编程技术网

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

Bash 查找不包含特定目录的目录,bash,shell,command-line,find,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 m

一直在四处搜索,但找不到解决此问题的方法。我想我正在按名称查找叶目录。在本例中,我希望得到一个名为“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的子目录的数量,并随它一起退出。没有这样的爱

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}}}'
试试这个


试试这个?

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


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

你的开始

find . -name modules \! -exec sh -c 'find -name modules' \;
还不错,只是需要一些改进

find . -name modules \! -exec sh -c 'find {} -mindepth 1 -name modules|read' \; -print
  • {}
    在找到的模块目录中搜索,而不是再次在顶部目录中搜索
  • -mindepth 1
    只在已找到的模块目录下搜索,而不是再次找到自己
  • |读取
    ,如果找不到文件,则设置退出状态(遗憾的是,find无法执行此操作)
  • -print
    打印找到的目录
    • 你的开始

      find . -name modules \! -exec sh -c 'find -name modules' \;
      
      还不错,只是需要一些改进

      find . -name modules \! -exec sh -c 'find {} -mindepth 1 -name modules|read' \; -print
      
      • {}
        在找到的模块目录中搜索,而不是再次在顶部目录中搜索
      • -mindepth 1
        只在已找到的模块目录下搜索,而不是再次找到自己
      • |读取
        ,如果找不到文件,则设置退出状态(遗憾的是,find无法执行此操作)
      • -print
        打印找到的目录

      您能否澄清您的示例所需列表,因为
      modules/package1/modules/spackage1/modules/
      不是您在示例结构中指定的目录。谢谢。有趣的是,我刚刚注意到
      find-名称模块-exec sh-c“退出0”\不返回任何结果。根据手册页,我猜退出0将使其与-exec语句不存在时相同。您能否澄清您的示例所需列表,因为
      modules/package1/modules/spackage1/modules/
      不是您在示例结构中指定的目录。谢谢。有趣的是,我刚刚注意到
      find-名称模块-exec sh-c“退出0”\不返回任何结果。根据manpage,我猜退出0将使其与-exec语句不存在时相同。