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 ?
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 can do this using a negated
find ./ ! -regex '.*(deb|vmdk)$'
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.
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