Find

GNU find -not 和 GNU find -prune -o -print 之間的區別

  • January 24, 2021

這個關於在 vim 中打開所有文件的答案除了

$$ condition $$: https://unix.stackexchange.com/a/149356/98426

給出與此類似的答案:

find . \( -name '.?*' -prune \) -o -type f -print

(我調整了答案,因為我的問題不是關於 vim)

否定條件在轉義括號中。但是,在我的測試文件中,以下

find . -type f -not -name '^.*'

產生相同的結果,但更容易讀寫。-not 方法與 -prune 方法一樣,會修剪任何以 . 開頭的目錄。(點)。我想知道 -not 和 -prune -o -print 方法會產生不同結果的邊緣情況是什麼。

Findutils 的資訊頁顯示以下內容:

-not expr : 如果 expr 為假則為真

-prune:如果文件是目錄,則不要深入其中。(並進一步說明需要 -o -print 才能實際排除最匹配的目錄)

它們似乎很難以這種方式進行比較,因為 -not 是一個測試,而 -prune 是一個動作,但對我來說,它們是可以互換的(只要 -o -print 出現在 -prune 之後)

首先,請注意這-not是一個 GNU 擴展,相當於標準!運算符。它幾乎沒有任何優勢!

-prune謂詞始終評估為並影響find遍歷目錄樹的方式。如果-prune執行的文件是目錄-L類型(可能在使用/ -H/進行符號連結解析後確定-follow),則find不會進入它。

所以-name 'pattern' -prune(縮寫)除了名稱匹配的目錄將被修剪-name 'pattern' -a -prune之外是相同的,即不會下降到它們中。-name 'pattern'``pattern``find

-name '.?*'匹配名稱以後.跟一個字元(其定義取決於目前語言環境)後跟 0 個或多個字元的文件。所以實際上,匹配.後跟一個或多個字元(以免修剪.起始目錄)。

因此,它會匹配隱藏文件,但需要注意的是它只匹配名稱也完全由字元組成的文件,即目前語言環境中的有效文本(至少在 GNU 實現中)。

所以在這裡,

find . \( -name '.?*' -a -prune \) -o -type f -a -print

這與

find . -name '.?*' -prune -o -type f -print

因為 AND ( -a, 隱含的) 優先於 OR ( -o)。

查找正常文件(無符號連結、目錄、fifo、設備…)且未隱藏且不在隱藏目錄中(假設所有文件路徑都是區域設置中的有效文本)。

find . -type f -not -name '^.*'

或其標準等價物:

find . -type f ! -name '^.*'

將找到名稱不以 . 開頭的正常文件^.

find . -type f ! -name '.*'

將找到名稱不以 開頭的正常文件.,但仍會報告隱藏目錄中的文件。

find . -type f ! -path '*/.*'

將省略隱藏文件和隱藏目錄中的文件,但find仍會下降到隱藏目錄(任何深度),只是跳過其中的所有文件,因此效率低於使用-prune.

引用自:https://unix.stackexchange.com/questions/630721