在printf和或中使用find

时间:2018-10-12 08:49:34

标签: shell find

我对使用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" \)
..

给出了预期的行为,请参阅接受的答案以获取解释。

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将永远不会打印文件。