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

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

Estou tentando excluir .svgarquivos .jpgdo meu comando find, mas ele ainda retorna os dois. O que estou fazendo de errado?

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

Responder1

Sua lógica é falha: com o comando que você tem agora, você encontra todos os não-arquivos .svgou todos os não- .jpgarquivos. O que você escreveu é:

find (tudo que não seja um SVGoutudo que não é JPG)

Então você vai pegar os arquivos JPG, pois findjá avaliei a primeira parte e te dei tudo que não é um arquivo SVG. Devido à forma como as opções são analisadas, se a primeira parte de uma orexpressão for avaliada como verdadeira, a segunda parte nem sequer é analisada.

Em essência, uma vez que findvocê retorna tudo que não é SVG, ele não se importa com o que você deseja com os arquivos JPG.


A maneira correta de expressar isso seria com uma lógica and:

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

Isso é lido como:

find (tudo que não seja um SVGetudo que não é JPG)

Ou, negando toda a expressão:

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

Que se lê como:

encontre tudo o que não é (um SVGouum JPG)

Observe que você pode pular o escape *se simplesmente colocá-lo entre aspas simples ou duplas, por exemplo -iname '*.jpg', . Isso é muito mais fácil de ler.

informação relacionada