2013-04-30 144 views
0

這有點複雜,但我想使用find命令來搜索項目(文件,目錄等)並運行命令以確定它們是否包含或不通過-exec參數,但是,我需要防止查找降序到已被排除的目錄。防止unix找到下降到不匹配的目錄

例如:

find . -exec sh -c 'echo "{}" | grep -i ".*/[a][^/]*"' \; 

位一個奇怪的例子,但基本上上面應該只匹配以字母開始一個項目,但是如果你運行它,那麼即使它不符合目錄,從其他字母開始,如果該目錄包含以字母a開頭的項目,find將仍然會進入它們並返回結果。例如,它會匹配以下內容:

./aFolder/aFile 
./Foo/Bar/aFile 
./aFolder/Foo/Bar/aFile 

我想這樣做是防止這種情況發生,這樣,如果一個目錄沒有那麼匹配它的內容會被忽略,在最後一個例子。/aFolder會匹配,但遇到./Foo時,搜索不應繼續進行。

如果一個目錄被排除在外,還是有類似的命令可以用這種方式進行限制,有沒有一種方法可以防止找到更深的下降?目前,我正在使用自定義shell腳本來自己完成遞歸,但它並不是實現大型目錄樹最有效的方法。

回答

1

我覺得這你想要做什麼:

find . \(-name . -or -exec sh -c 'echo "{}" | grep -iq "^.*/[a][^/]*\$"' \; -or \(-prune -false \) \) -print 

一些變化,從你的

  • -q添加到grep和-print來查找,以確保輸出匹配什麼查找
  • 將^和$加到正則表達式中以確保檢查整個文件名
  • 添加-or(-prune -false)以確保不匹配的項目不會下降到或匹配(僅單獨使用Prune)
  • 最後,添加-name。否則頂級目錄將失敗,所以,正確的,沒有什麼會返回
+0

嗯,我不知道這是工作正常,因爲它似乎仍然下降到目錄。下面是我正在運行的確切命令:'find。 \(-exec sh -c'[$(stat -qf「%i」「'」$ PREVIOUS「'/ {}」)!= $(stat -qf「%i」「'」$ TARGET「'/ }「)];退出$?'\; - 或者(--prune -false \)\)-print'。基本上它是檢查當前文件的inode是否與先前目錄中的inode不同,但它仍然下降。 – Haravikk 2013-05-01 14:59:58