为何find命令中使用'-o -print'会无输出?
为何find命令中使用'-o -print'会无输出?
嘿,这个问题其实是find命令的运算符优先级在搞鬼,我来给你掰扯清楚~
首先得搞懂find的两个关键规则:
- 当你没显式指定动作(比如
-print)时,find默认会对所有匹配到的文件执行-print find里的逻辑与(-a,可以省略不写)优先级比逻辑或(-o)高,和咱们平时写代码的逻辑优先级是一样的
先看你写的version 1命令:
find . -iname "*tif" -o -iname "*foo"
因为没有显式动作,find会自动给整个匹配表达式加上默认的-print,实际等价于:
find . \( -iname "*tif" -o -iname "*foo" \) -print
这里括号把两个-iname的条件组合成一个整体,只要满足其中一个,就会执行-print,所以你能看到所有tif文件的输出。
再看version 2的命令:
find . -iname "*tif" -o -iname "*foo" -print
因为逻辑与的优先级更高,这个命令会被find解析成:
find . -iname "*tif" -o \( -iname "*foo" -a -print \)
翻译成人话就是:要么匹配到tif文件但不做任何输出动作,要么匹配到foo文件才执行-print。而你的目录里没有*.foo文件,自然就啥输出都没有啦!
如果想让version 2和version 1输出一致,你需要用括号把OR的条件括起来(注意括号要加反斜杠转义,避免被shell解析),强制让find先计算OR的逻辑,再统一执行-print:
find . \( -iname "*tif" -o -iname "*foo" \) -print
这样运行后,就能得到和version 1一样的结果了~
备注:内容来源于stack exchange,提问作者whiskeychief
相关产品推荐
相关产品推荐

