GNU find -not 和 GNU find -prune -o -print 之間的區別
這個關於在 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
.