Estou tentando excluir .svg
arquivos .jpg
do 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 .svg
ou todos os não- .jpg
arquivos. 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 find
já 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 or
expressão for avaliada como verdadeira, a segunda parte nem sequer é analisada.
Em essência, uma vez que find
você 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.