2012-06-12 76 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打印找到的目錄