排除查找中的目錄

排除查找中的目錄

find每當我使用它時,對我來說總是一個完全的謎;我只想/mnt從搜尋中排除(我在 WSL 上的 Ubuntu 20.04 上的 bash 中,所以不希望它在 Windows 空間中搜尋)下的所有內容,但是find只是錯誤地進入這些目錄,完全忽略了我。我從這個頁面找到了語法。https://stackoverflow.com/questions/4210042/how-to-exclude-a-directory-in-find-command並嘗試了所有的變化 - 都失敗了。

sudo find / -name 'git-credential-manager*' -not -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '*/mnt/*'

當我這樣做時,它只是犯了錯誤/mnt並拋出錯誤(這確實令人沮喪,因為上面的語法看起來很清晰,並且 stackoverflow 頁面語法似乎是正確的):

find: ‘/mnt/d/$RECYCLE.BIN/New folder’: Permission denied
find: ‘/mnt/d/$RECYCLE.BIN/S-1-5-18’: Permission denied

有人可以告訴我如何停止find忽略我的目錄排除開關嗎?

答案1

Find-path不排除路徑,這表示「不報告名稱與此路徑相符的任何符合項目」。它仍然會下降到目錄中並蒐索它們。你想要的是-prune(來自man find):

       -prune True;  if  the file is a directory, do not descend into it.  If
              -depth is given, then -prune has no  effect.   Because  -delete
              implies  -depth, you cannot usefully use -prune and -delete to‐
              gether.  For example, to skip the directory src/emacs  and  all
              files  and  directories  under  it,  and print the names of the
              other files found, do something like this:
                  find . -path ./src/emacs -prune -o -print

所以你要:

sudo find / -path '/mnt/*' -prune -name 'git-credential-manager*' 

-mount雖然,根據您試圖排除的內容,使用(GNU find)或-xdev(其他)可能會更容易:

man find

-mount不要降級其他檔案系統上的目錄。的替代名稱-xdev,用於與 find 的某些其他版本相容。

所以:

sudo find / -mount -name 'git-credential-manager*' 

答案2

它不會忽略該選項。謂詞-path針對遇到的每個文件進行評估,對於該樹中的文件,它只是失敗。它不會影響find目錄樹的行走方式,並且您可以擁有類似的東西find . ! -path "./foo/*" -o -name '*.txt',可以匹配外部的所有內容,但也可以匹配其中的foo文件。*.txt

GNU 手冊頁這裡做什麼相當清楚,請-prune改為使用:

-path pattern
....要忽略整個目錄樹,請使用-prune而不是檢查樹中的每個檔案。例如,若要跳過目錄src/emacs及其下的所有檔案和目錄,並列印找到的其他檔案的名稱,請執行以下操作:

find . -path ./src/emacs -prune -o -print

相關內容