Respostas:
Você pode fazer isso usando um negado -regex
também: -
find ./ ! -regex '.*\(deb\|vmdk\)$'
sim você pode:
find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)
Explicação da especificação POSIX :
! expressão : Negação de um primário; o operador NÃO unário.
( expressão ): Verdadeiro se expressão for verdadeira.
expressão -o expressão : Alternação de primárias; o operador OR. A segunda expressão não deve ser avaliada se a primeira expressão for verdadeira.
Observe que os parênteses, tanto de abertura quanto de fechamento, são prefixados por uma barra invertida ( \
) para impedir a avaliação pelo shell.
-exec
alguma ação nos find
resultados, lembre-se de colocar entre parênteses \( \)
todos os critérios; caso contrário, -exec
será aplicado apenas ao último -or
critério. Para trabalhar em todos eles, coloque-os entre parênteses:find \( <criterion> -o <criterion> \) -exec <command>
Você estava perto da solução:
find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"
Você pode combinar os seguintes operadores lógicos em qualquer sequência:
-a -and - operator AND
-o -or - operator OR
! - operator NOT
Você pode usar expressões regulares como em:
find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'
Barra invertida é o caractere de escape; .
corresponde a um único caractere e *
serve para corresponder ao caractere anterior zero ou mais vezes, portanto, .*
significa corresponder a zero ou mais caracteres.
-regex
é menos portátil que-name
.