我对使用find
并将-printf
与-o
结合起来感到困惑。假设我在目录中有一些文件,例如
$ ls
a1 b1
,我想将find
与两个过滤器一起使用。以AND开头:
find . -iname "a*" -iname "*1"
./a1
并使用-printf
for counting:
find . -iname "a*" -iname "*1" -printf '.'
.
似乎很好。现在,使用-o
尝试相同的操作以获取两个过滤器的OR:
$ find . -iname "a*" -o -iname "*1"
./b1
./a1
$ find . -iname "a*" -o -iname "*1" -printf '.'
.
为什么我没有得到..
?更改参数顺序无济于事:
$ find . -printf '.' -iname "a*" -o -iname "*1"
...
编辑:
$ find . -type f \( -iname "a*" -o -iname "*1" \)
..
给出了预期的行为,请参阅接受的答案以获取解释。
答案 0 :(得分:2)
请参见OPERATORS
手册页的find
部分:
运算符
按优先级递减的顺序列出:
( expr )
强制优先。由于括号是外壳的特殊字符,因此通常需要用引号引起来。为此,本手册页中的许多示例都使用反斜杠:
'\(...\)'
而非'(...)'
。[...]
expr1 expr2
连续两个表达式都用隐含的“ and”连接;如果expr1为false,则不会评估expr2。
[...]
expr1 -o expr2
或者;如果expr1为true,则不会评估expr2。
然后,强调一下:
请注意,
-a
是隐式指定的(例如,两个测试在它们之间没有显式运算符的情况下出现)或显式具有比-o
更高的优先级。 这意味着find . -name afile -o -name bfile -print
将永远不会打印文件。