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