Como encontrar todas as imagens com um determinado tamanho de pixel usando a linha de comando?

12

Estou tentando encontrar todas as imagens JPG em uma pasta com subpastas com largura ou altura abaixo de 300px.

Dessa forma, quero detectar miniaturas antigas e excluí-las.

Com certeza, posso encontrar todas as imagens usando find :

find . -iname "*.jpg" -type f | ...

Mas o que vem depois do cano? Qual pacote posso usar para detectar os atributos da imagem?

    
por mcbetz 09.01.2013 / 16:20

3 respostas

12

Você pode usar identify de imagemagick e pode usar o seguinte comando:

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '<300 || <300'

o uso de -exec <command> '{}' \; garante que seu nome de arquivo possa ter espaços, ou você pode usar

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '<300 || <300'

onde o -I{} cuida da mesma coisa.

O que eu gosto sobre identify é que você pode especificar o formato de saída; neste caso, '%w %h %i' , que dá a largura, a altura e o nome completo do caminho da imagem. Em seguida, a expressão awk mantém apenas as linhas para as quais a imagem é menor que o tamanho desejado.

Exemplo da saída:

64 64 ./thumbsup.jpg
100 150 ./photomin.jpg

Edit: Se você quiser apenas os nomes de arquivo (para canalizar para rm , por exemplo), simplesmente altere $line na declaração awk para , então ele imprimirá apenas a terceira coluna.

    
por Gerhard Burger 09.01.2013 / 17:02
1

Acho que a resposta aceita é muito boa, mas queria adicionar outra solução possível ...

Embora eu use ImageMagick ferramentas com mais frequência agora, netpbm é um velho amigo para processar imagens. Você pode ver o tamanho de qualquer formato de imagem com o comando:

anytopnm file | pamfile

Isso gerará uma saída semelhante a:

stdin:  PPM raw, 1650 by 1275  maxval 255

Para responder à pergunta "o que vem depois do pipe?", eu uso while read com mais frequência do que eu uso xargs porque é mais flexível. Minha resposta netpbm para a pergunta é assim:

find -iname \*.jpg | while read img; do \
  anytopnm "$img" | pamfile | \
    perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || rm -v "$img"; \
done
    
por NateT 10.02.2015 / 20:28
0

O comando identify do pacote imagemagick faz o que você deseja:

$ identify abc.jpg
abc.jpg JPEG 1952x3264 1952x3264+0+0 8-bit DirectClass 1.111MB 0.000u 0:00.000

Novamente, você precisará usar grep para classificar o tamanho da imagem.

No entanto, suspeito que, a menos que você tenha uma ampla variedade de tamanhos de imagem, seria mais fácil usar apenas find para remover arquivos JPEG abaixo de um determinado tamanho:

find -iname '*.jpg' -size -10k -delete

(Vale a pena correr sem -delete primeiro para verificar que não encontra coisas que deseja guardar - não o avisará antes da eliminação).

    
por chronitis 09.01.2013 / 17:02