如何在查找中正確排除目錄?

如何在查找中正確排除目錄?

根據這個問題:如何排除查找中的目錄,命令應該是這樣的:

find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print

但如果我這樣做

find . -type d \( -path "./.cpan" -o -path "./.mozilla" -o "./.cache" \) -prune -o -print

這給出: find: paths must precede expression: ./.cache'

find: possible unquoted pattern after predicate -o'?

但我做了報價。

另外,-path選項後,路徑應該是絕對路徑還是相對路徑?因為我已經包含了當前目錄./[somefile],但是需要它嗎-path

答案1

您錯過了-path最後一個選項值前面的謂詞"./.cache"

所使用的路徑-path必須以 所使用的頂級搜尋路徑開頭find。例如

  • find . -path './something/here'
  • find /etc -path '/etc/init.d'

*如果要符合目錄名稱而不指定其在檔案系統樹中的位置,則可能需要使用通配符。此範例將符合-type f目錄下某處的所有檔案 ( )wizard

  • find . -path '*/wizard/* -type f -print

答案2

對於未來的讀者來說,符合 POSIX 標準的解決方案不遍歷排除的目錄,也不將它們包含在輸出中有一般格式:

單一排除

find searchpath \! \( -path searchpath/excludepath -prune \)

多重排除

find searchpath \! \( \( -path searchpath/excludepath1 -o -path searchpath/excludepath2 -o -path 'searchpath/excludepathprefix-*' \) -prune \)

阻止這種遍歷可以使巨大的當這些目錄包含許多檔案時,可以提高效能。從輸出中完全省略排除的目錄可以防止無意中對其進行操作。

可放置更多濾波器和輸出參數所有顯示的內容,除了那些-maxdepth始終緊接在 後面的內容searchpath。的參數-path必須與該目錄的輸出相匹配find,且通配符必須被轉義/引用。


對於這個問題,解決方案是這樣的(因為-print是預設的):

find . \! \( \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -prune \)

答案3

當我搜尋資訊以使 find 命令排除多個目錄時,我來到此頁面。我找到了答案沃夫最優雅的。根據我的實驗,基於相同概念的變體是:

find . \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -not -prune -o -print

相關內容