find で「or」検索を行うにはどうすればいいですか?

find で「or」検索を行うにはどうすればいいですか?

基本的に、2 つ (またはそれ以上) の検索コマンドを 1 つで実行する方法 (「and」ではなく「or」検索) を知りたいのです。

find . -name "*.pem"
find . -name "*.crt"

答え1

findの「または」演算子は次のとおりです-o

find . -name "*.pem" -o -name "*.crt"

それは短絡です、つまり2 番目の部分は、最初の部分が false の場合にのみ評価されます。つまり、一致するファイルは*.pemテストされません*.crt

-o明示的 ( ) か暗黙的かに関係なく、「and」よりも優先順位が低くなります。-a演算子を組み合わせる場合は、「or」の部分を括弧で囲む必要がある場合があります。

find . \( -name "*.pem" -o -name "*.crt" \) -print

私のテストでは、予想どおり、正規表現を使用するよりも大幅に高速です (正規表現は glob よりもテストにコストがかかり、-regexファイル名だけでなく完全なパスをテストします-name)。

答え2

この質問を入力しているときに、find はデフォルトで正規表現ではなくグロブを使用していることに気付きました。しかし、正規表現を使用する方法があるはずです。

案の定... POSIX 拡張を使用するために regextype を変更する必要がありましたが、それで目的の結果が得られました。

find . -regextype posix-extended -regex ".*pem|.*crt"

カプラ!

関連情報