Como combinar 2 condições de nome em find?

76

Eu gostaria de pesquisar arquivos que não correspondam a 2 -name conditions. Eu posso fazer assim:

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

e isso produzirá resultado adequado, mas posso juntar essas duas condições com OR de alguma forma?

    
por Patryk 11.10.2012 / 20:03

4 respostas

36

Você também pode fazer isso usando um -regex negado: -

 find ./ ! -regex  '.*\(deb\|vmdk\)$'
    
por 11.10.2012 / 23:18
115

sim, você pode:

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

Explicação da especificação POSIX :

! 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.

Observe que os parênteses, abertura e fechamento, são prefixados por uma barra invertida ( \ ) para impedir a avaliação pelo shell.

    
por 11.10.2012 / 20:08
18

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
    
por 11.06.2016 / 15:18
6

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, então .* significa corresponder a zero ou mais caracteres.

    
por 12.10.2012 / 15:48

Tags