How to combine 2 -name conditions in find?

I would like to search for files that would not match 2 -name conditions. I can do it like so :

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

and this will yield proper result but can I join these 2 condition with OR somehow ?

Asked By: Patryk


yes, you can:

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

Explanation from the POSIX spec:

! expression : Negation of a primary; the unary NOT operator.

( expression ): True if expression is true.

expression -o expression: Alternation of primaries; the OR operator. The second expression shall not be evaluated if the first expression is true.

Note that parenthesis, both opening and closing, are prefixed by a backslash () to prevent evaluation by the shell.

Answered By: Serge

You can do this using a negated -regex, too:-

 find ./ ! -regex  '.*(deb|vmdk)$'
Answered By: Alex Leach

You can use regular expressions as in:

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

Backslash is the escape character; . matches a single character, and * serves to match the previous character zero or more times, so .* means match zero or more characters.

Answered By: user22304

You were close to a solution:

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

You can combine the following logic operators in any sequence:

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT
Answered By: DenisKolodin
Categories: Answers Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.