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


94

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

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

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

回答:


46

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

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

6
-regexはに比べて移植性が低いことに注意してください-name
jw013

145

はい、次のことができます。

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

POSIX仕様からの説明:

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

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

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

開始と終了の両方の括弧には\、シェルによる評価を防ぐために、円記号()が前に付いていることに注意してください。


2
あなたがやっている場合-execまたは上の他のアクションfindの結果、Parentheseのことを忘れないでください\( \)それ以外の場合は、全体の条件を-execのみ、最後に適用されます-or-ed基準。それらのすべてで動作するように、それらをParentheseの:find \( <criterion> -o <criterion> \) -exec <command>
ビクターSergienko

25

あなたは解決策に近かった:

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

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

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

6

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

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

バックスラッシュはエスケープ文字です。.単一の文字*に一致し、前の文字に0回以上.*一致するため、0個以上の文字に一致します。


1
説明を追加すると、答えが良くなります。
NN

あなたが正しい。説明を追加しました。
フランチェスコターコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.