Por que não posso excluir 2 ou mais padrões do comando find no Linux?

1

Eu estou tentando excluir .svg e .jpg arquivos do meu comando find, mas ele ainda retorna os dois. O que estou fazendo errado?

find . \( ! -iname \*\.svg -o ! -iname \*\.jpg \)
    
por PeanutsMonkey 11.01.2013 / 11:04

1 resposta

2

Sua lógica é falha: com o comando que você tem agora, você encontra todos os arquivos que não são .svg ou todos os arquivos que não são .jpg . O que você escreveu é como:

find (everything that's not an SVG or everything that's not a JPG)

Então você obterá os arquivos JPG, porque find já avaliou a primeira parte e deu a você tudo o que não é um arquivo SVG. Devido à maneira como as opções são analisadas, se a primeira parte de uma expressão or for avaliada como true, a segunda parte nem será analisada.

Em essência, uma vez que find lhe devolve tudo o que não é um SVG, não se importa com o que você deseja com os arquivos JPG.

A maneira correta de expressar isso seria com um lógico and :

find . \( ! -iname '*.svg' -a ! -iname '*.jpg' \)

Isto diz:

find (everything that's not an SVG and everything that's not a JPG)

Ou, negando toda a expressão:

find . ! \(-iname '*.svg' -o -iname '*.jpg' \)

Qual lê como:

find everything that's not (an SVG or a JPG)

Observe que você pode ignorar o * se simplesmente colocá-lo entre aspas simples ou duplas, por exemplo, %código%. Isso é muito mais fácil de ler.

    
por 11.01.2013 / 11:18

Tags