Find(1):测试“A”通过,但测试“A -o B”失败

Find(1):测试“A”通过,但测试“A -o B”失败

这个函数不打印任何东西;

skyrimse_testroot() {
    local directory="$1"
    find "$directory" \
        \( -type f -ipath "${directory}/data/scripts/*.pex"        \) -o \
        \( -type d -ipath "${directory}/data/meshes"               \) \
        -print -quit
}

但这个确实如此(我删除了第二个测试组);

skyrimse_testroot() {
    local directory="$1"
    find "$directory" \
        \( -type f -ipath "${directory}/data/scripts/*.pex"        \)  \
        -print -quit
}

$1是绝对路径,起点和-ipath参数也是绝对路径。

根据我对布尔逻辑的浅薄了解,将更多 OR 子句链接到正表达式不应使该表达式得出负值。要么find是坏了,要么是我出了什么问题,我怀疑比前者更多的一个选择。

答案1

我不会说破坏,但find测试中的优先级可能非常令人惊讶,尤其是涉及操作的方式。

https://manpages.debian.org/stable/findutils/find.1.en.html

无缺陷

运算符优先级令人惊讶

该命令find . -name afile -o -name bfile -print永远不会打印 一份文件因为这实际上相当于find . -name afile -o \( -name bfile -a -print \).请记住, 的优先级-a高于 的优先级-o,并且当测试之间没有指定运算符时, -a假定为。

因此,在您的示例中,当前的括号不是必需的,因为“and”具有更高的优先级,但您必须在所有测试周围添加它们。

find "$directory" \
        '(' \
            -type f -ipath "${directory}/data/scripts/*.pex" \
            -o \
            -type d -ipath "${directory}/data/meshes" \
        ')' \
        -print -quit

相关内容