![如何使用 find 进行“或”搜索?](https://linux22.com/image/146835/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20find%20%E8%BF%9B%E8%A1%8C%E2%80%9C%E6%88%96%E2%80%9D%E6%90%9C%E7%B4%A2%EF%BC%9F%20.png)
本质上,我想知道如何在一个命令中运行 2 个(或更多)查找命令 - “或”搜索而不是“和”:
find . -name "*.pem"
find . -name "*.crt"
答案1
find
的“或”运算符是-o
:
find . -name "*.pem" -o -name "*.crt"
是短路了,IE仅当第一部分为 false 时才会评估第二部分:匹配的文件*.pem
不会针对 进行测试*.crt
。
-o
优先级低于“and”,无论是显式 ( -a
) 还是隐式;如果您要组合运算符,您可能需要用括号将“或”部分括起来:
find . \( -name "*.pem" -o -name "*.crt" \) -print
在我的测试中,这比使用正则表达式要快得多,正如您所期望的那样(正则表达式的测试比 glob 更昂贵,并且-regex
测试完整路径,而不仅仅是文件名-name
)。
答案2
当我输入这个问题时,我突然想到 find 默认使用通配符而不是正则表达式。但我敢打赌有一种方法可以使用正则表达式!
果然...我必须更改正则表达式类型以使用 posix-extend,但这得到了我想要的。
find . -regextype posix-extended -regex ".*pem|.*crt"
卡普拉!