web-dev-qa-db-ja.com

findで2つの名前の条件を組み合わせる方法は?

2に一致しないファイルを検索したい-name条件。私はそうすることができます:

find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"

これで適切な結果が得られますが、これらの2つの条件をORで結合できますか?

108
Patryk

否定された-regexを使用してこれを行うこともできます:-

 find ./ ! -regex  '.*\(deb\|vmdk\)$'
52
Alex Leach

はい、できます:

find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)

POSIX spec からの説明:

expression:プライマリの否定;単項NOT演算子。

expression):式が真であれば真。

-o:プライマリの代替; OR演算子。最初の式が真の場合、2番目の式は評価されません。

開始と終了の両方の括弧の前にはバックスラッシュ(\)シェルによる評価を防止します。

162
Serge

あなたは解決策に近づいていました:

find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"

次の論理演算子を任意の順序で組み合わせることができます。

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT
28
DenisKolodin

次のように正規表現を使用できます。

find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'

バックスラッシュはエスケープ文字です。 .は1文字に一致し、*は、前の文字と0回以上一致するため、.*は、ゼロ個以上の文字に一致することを意味します。

6
Francesco Turco