Find

添加 -print0 時,查找命令返回不同的結果

  • January 3, 2022

在進行類似的搜尋時,在 find 命令之後find -type d添加 -參數會導致搜尋返回比沒有它更多的結果。print0``find -print0 -type d

如果您了解shell(以及 C、C++ 和衍生語言)中的 and 運算符,那麼您&&將了解.||``-a``-o``find

刷新你的記憶:

在貝殼裡,

命令1 && *命令**2*

執行*command1,如果它 ( command1) 成功,它 (shell) 執行command2*。

命令 *1 ||* *命令2*

執行*command1,並且,如果它(command1)失敗,它(外殼)執行command2*。

在可編譯的語言中,

*expr1* && *expr2*

評估*expr1。如果它 ( expr1) 的計算結果為假(零),它會將其作為整個表達式的值返回。否則(如果expr1計算結果為真(非零)值),它會計算expr2*並將其作為整個表達式的值返回。

*expr1* || *expr2*

評估*expr1。如果它 ( expr1) 計算結果為真(非零)值,則將其作為整個表達式的值返回。否則(如果expr1計算結果為假(零)),它會計算expr2*並將其作為整個表達式的值返回。

這被稱為“短路評估”,因為它允許評估布爾表達式而不評估不需要其值來確定表達式的整體值的項。

引用find(1)

GNUfind根據優先規則(參見 OPERATORS 部分),通過從左到右評估給定表達式來搜尋以每個給定文件名為根的目錄樹,直到結果已知(左側對於操作為假,真for or ),此時find移動到下一個文件名。

            ⋮

表達式

該表達式由……測試(返回真或假值)和動作(具有副作用並返回真或假值)組成,所有這些都由運算符分隔。  -and假定在省略運算符的情況下。

                    ⋮

> > ACTIONS小節指出*-print**與
> > 大多數操作一樣,始終返回 true 值。* > >

                    ⋮

運營商

            ⋮

expr1 expr2

expr1 -a expr2

expr1 -and expr2     _ ⋅⋅⋅⋅⋅⋅⋅⋅不符合POSIX 和; 如果expr1為假,則不計算expr2 。

expr1 -o expr2

expr1 -or expr2     _ ⋅⋅⋅⋅⋅⋅⋅不符合POSIX 或者; 如果expr1為真,則不計算expr2

開放組規範find有類似的說法:

find實用程序應遞歸地降低目錄層次結構……,評估一個布爾表達式, 該表達式由 OPERANDS 部分中描述的每個遇到的文件的主元素組成。

            ⋮

操作數

            ⋮-

列印初級應始終評估為真;它會導致目前路徑名被寫入標準輸出。

            ⋮

可以使用以下運算符組合初選(按優先級遞減的順序):

            ⋮

表達式 $$ -a $$ 表達 初選的結合;AND 運算符由兩個主要元素的並置隱含或由可選的**-a**運算符顯式表示。如果第一個表達式為假,則不應計算第二個表達式。

表達式  -o  表達式 初選交替;OR 運算符。如果第一個表達式為真,則不應計算第二個表達式。

兩份文件都說,“如果不存在表達式,則應使用**-print作為表達式。”**

—————- TL; 博士 —————-

所以,

find -type d

相當於

find -type d -print

這相當於

find -type d -a -print

意思是,

  • 對於每個文件,

    • 評估-type d測試。
    • 如果為真(即,如果目前“文件”是一個目錄),則評估(執行)該-print操作。

鑑於

find -print -type d

相當於

find -print -a -type d

意思是,

  • 對於每個文件,

    • 評估(執行)-print操作 (即,所有文件都會發生這種情況)
    • 如果它是真的(-print總是如此),評估-type d測試。
    • 而且,由於這是命令的結尾,因此-type d忽略了測試結果。

所以你有它。

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