添加 -print0 时,查找命令返回不同的结果

sa2*_*289 4 find

在执行类似 的搜索时find -type d,在 find 命令之后添加 -print0 参数,例如find -print0 -type d会导致搜索返回比没有它更多的结果。

Sco*_*ott 12

如果你了解&&||运营商在壳(也包括C,C ++,和衍生语言),那么你了解-a-ofind

刷新你的记忆:

在外壳中,

命令1   &&  命令2

运行command1,并且,如果它 ( command1) 成功,则它(外壳程序)运行command2

命令 1   ||  命令 2

运行command1,并且,如果它 ( command1) 失败,它(外壳程序)将运行command2

在可编译的语言中,

表达式1   &&  表达式2

评估expr1. 如果它 ( expr1) 的计算结果为假(零),它会将其作为整个表达式的值返回。否则(如果expr1计算为真(非零)值),它会计算expr2并返回该值作为整个表达式的值。

expr1   ||  表达式2

评估expr1. 如果它 ( expr1) 的计算结果为真(非零)值,则返回该值作为整个表达式的值。否则(如果expr1计算结果为假(零)),它会计算expr2并将其作为整个表达式的值返回。

    这被称为“短路评估”,因为它允许评估布尔表达式,而无需评估其值不需要确定表达式的整体值的项。

引用find(1)

GNUfind搜索以每个给定文件名为根的目录树,通过从左到右评估给定的表达式,根据优先级规则(参见操作员部分),直到结果已知(左侧为假,操作为真) for),此时find移至下一个文件名。
            ?

表情

表达式由…测试(返回真或假值)和动作(有副作用并返回真或假值)组成,所有这些都由运算符分隔。  -and假定运算符被省略。
                    ?
    ACTIONS小节指出-print
    大多数操作一样,始终返回 true 值。
                    ?

运营商

            ?
expr1 expr2
expr1 -a expr2
expr1 -and expr2 ??? ??????????????????????????????????????????????????? 不符合 POSIX
    和; 表达式2,如果不计算表达式1为假。
expr1 -o expr2
expr1 - 或expr2 ??? ??????????????????????????????????????????????????? 不符合 POSIX
    或者; 表达式2,如果不计算表达式1是真的。

公开组规范find也有类似的东西说:

发现工具应递归方式降低目录层次...,评估在遇到的每个文件操作数部分中描述的初选组成的布尔表达式。
            ?

操作数

            ?
-打印
    主要应始终评估为真;它将导致将当前路径名写入标准输出。
            ?
可以使用以下运算符(按优先级递减的顺序)组合主要元素:
            ?

表达式 [-a] 表达式
    初选的结合;AND 运算符由两个主要元素的并置隐含,或由可选的-a运算符明确表示。如果第一个表达式为假,则不应计算第二个表达式。
表达式  -o  表达式
    初选交替;OR 运算符。如果第一个表达式为真,则不应计算第二个表达式。

两份文件都说,“如果不存在表达式,则应使用-print作为表达式。”

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

所以,

find -type d
Run Code Online (Sandbox Code Playgroud)

相当于

find -type d -print
Run Code Online (Sandbox Code Playgroud)

这相当于

find -type d -a -print
Run Code Online (Sandbox Code Playgroud)

意思是,

  • 对于每个文件,
    • 评估-type d测试。
    • 如果为真(即,如果当前“文件”是一个目录),则评估(执行)该-print操作。

find -print -type d
Run Code Online (Sandbox Code Playgroud)

相当于

find -print -a -type d
Run Code Online (Sandbox Code Playgroud)

意思是,

  • 对于每个文件,
    • 评估(执行)-print操作 (即,这对所有文件都会发生)
    • 如果它是真的(-print总是如此),请评估-type d测试。
    • 并且,由于这是命令的结尾,因此-type d忽略测试结果。

所以你有它。

  • 很好的解释。我建议把 TL;DR 部分放在第一位,但无论如何你都有我的投票权。 (2认同)

sa2*_*289 9

find 参数的顺序很重要。该命令需要按原样构建find -type d -print0,然后它将按预期工作。我只是想我会发布这个以防万一它对任何人都有帮助。

  • 至于为什么顺序很重要,[this](http://mywiki.wooledge.org/UsingFind) 可能会引起兴趣 (2认同)