2012-11-19 96 views
68

我有這樣排除使用子目錄中找到

data 
|___ 
    | 
    abc 
    |____incoming 
    def 
    |____incoming 
    |____processed 
    123 
    |___incoming 
    456 
    |___incoming 
    |___processed 

目錄結構有一個在所有數據目錄中的文件夾的話子文件夾中。我想從除了def/incoming和456/incoming dirs之外的所有文件夾和子文件夾中獲取所有文件。 我嘗試了用下面的命令

find /home/feeds/data -type d \(-name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print 

但預計它無法正常工作。

拉維

+1

這不是很好的建議,但它會讓你出了很多的情況下,快速和骯髒的:管,要'的grep -v something'排除不管它是你不」 t想 – Miquel

回答

126

這工作:

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*" 

說明:

  • find /home/feeds/data:開始從指定的路徑遞歸發現
  • -type f:發現只有
  • -not -path "*def/incoming*"文件:不包含任何與def/incoming作爲我的一部分TS路徑
  • -not -path "*456/incoming*":不包括與456/incoming什麼作爲其路徑的一部分
+0

得到一個錯誤「找到:壞選項-not 找到:路徑列表謂詞列表」 – Ravi

+0

@Ravi你使用bash shell嗎?我只是在我的終端上測試了它,它對我很有用。如果您對腳本進行了修改,請嘗試複製並粘貼解決方案。 –

+0

它的工作,但是,它列出的dirs不在這些dirs中的文件。 – Ravi

4

-name只匹配文件名,而不是整個路徑。您想使用-path代替您修剪目錄的部分,如def/incoming

4

只是爲了文檔的目的:可能因爲有許多search'n'skip星座越挖越深(如我不得不)。可能會發現prune是你的朋友,而-not -path不會做你期望的。

因此,這是那排除目錄15查找範例的寶貴例如:

http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

要鏈接到最初的問題,排除終於爲我工作是這樣的:

find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

然後,如果您希望查找一個文件並仍排除路徑,只需添加| grep myFile.txt即可。

它也可能取決於您的查找版本。我看到:

$ find -version 
GNU find version 4.2.27 
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX 
0
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/" 
+2

一些解釋可能會使它變成好得多的答案。 –

+0

感謝您使用此代碼段,這可能會提供一些有限的短期幫助。正確的解釋將通過說明爲什麼這是解決問題的良好方法來大大提高其長期價值,並且會使未來的讀者對其他類似問題更有用。請編輯您的答案以添加一些解釋,包括您所做的假設 –