2012-09-04 64 views
6

我有一個這樣的文件夾結構(這是一個小片段):如何查找/ grep目錄名稱與* nix上的「x」匹配但不匹配「y」的所有路徑?

└── test 
   └── cases 
      └── model 
         ├── client 
         │ ├── socketsTest.coffee 
         ├── server 
         │   └── socketsTest.coffee 
         └── shared 
          └── findersTest.coffee 

的問題是,你如何列出結束.coffee並在client文件夾中不存在的所有路徑?

以下命令將返回匹配.coffee中存在的server文件夾中的所有文件:

find test -name "*Test.coffee" | egrep '/*server*/' 

但我真正需要的是符合一切除了什麼是在客戶端文件夾中的正則表達式。

在* nix上做到這一點最乾淨的方法是什麼?最終目標是有來無迴文件client文件夾內,因此,對於上面的樹,這將是:

$ <find files except those a client folder> 
test/cases/model/server/socketsTest.coffee 
test/cases/model/shared/findersTest.coffee 

我試圖做這樣的事情,但沒有運氣:

find test -name "*Test.coffee" | egrep '*model/[^client]*' 

回答

10

可以使用-prune忽略目錄的操作。 -o的意思是「或」,所以請閱讀爲「如果它被命名爲客戶端修剪它,否則打​​印名爲*.coffee的文件」。

find test -name client -prune -o -name '*.coffee' -print 

或者你可以使用一個雙重考驗,這是更容易閱讀,但略效率較低,因爲它會遞歸到client/目錄,而第一個避免他們完全。

find test -name '*.coffee' ! -wholename '*/client/*' 
+0

真棒,謝謝!兩者對我來說都是新的。 –

1

我想第二個-prune回答約翰庫格爾曼給。

另一種方法來解決使用grep這個問題是使用-v選項:

find test -name "*Test.coffee" | grep -v client 

-v反轉模式匹配,因此,所有包含匹配「客戶」被丟棄