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 ?
You can do this using a negated
find ./ ! -regex '.*\(deb\|vmdk\)$'
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.
You was close to solution:
find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"
You can combine following logic operators in any sequence:
-a -and - operator AND -o -or - operator OR ! - operator NOT
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.