根據這個問題:如何排除查找中的目錄,命令應該是這樣的:
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