如何使用 find 進行「或」搜尋?

如何使用 find 進行「或」搜尋?

本質上,我想知道如何在一個命令中運行 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"

卡普拉!

相關內容