Como combinar condições de 2 nomes no find?

94

Gostaria de procurar arquivos que não correspondam a 2 -namecondições. Eu posso fazer assim:

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

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

Patryk
fonte

Respostas:

46

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

 find ./ ! -regex  '.*\(deb\|vmdk\)$'
Alex Leach
fonte
6
Observe que -regexé menos portátil que -name.
jw013
145

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.

Sarja
fonte
2
Se você estiver realizando -execalguma ação nos findresultados, lembre-se de colocar entre parênteses \( \)todos os critérios; caso contrário, -execserá aplicado apenas ao último -orcritério. Para trabalhar em todos eles, coloque-os entre parênteses:find \( <criterion> -o <criterion> \) -exec <command>
Victor Sergienko
25

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
DenisKolodin
fonte
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, portanto, .*significa corresponder a zero ou mais caracteres.

Francesco Turco
fonte
1
Adicionar uma explicação melhoraria sua resposta.
NN
Você está certo. Adicionadas algumas explicações.
Francesco Turco