Encontre imagens por tamanho: find / file / awk

8

Estou tentando encontrar arquivos de imagem png com uma certa altura (acima de 500px). Eu sei que file retornará as dimensões da imagem. Exemplo:

$ file TestImg1a.png

TestImg1a.png: PNG image data, 764 x 200, 4-bit colormap, non-interlaced   

Mas eu preciso usar isso para encontrar todos os arquivos em um diretório com uma altura acima de 500px. Eu sei como imprimir todos os arquivos, independentemente da altura:

find . -name '*.png' | xargs file | awk '{print $7 " " $1}'

Mas como limitar os $ 7 a esses resultados acima de 500?

    
por steve-er-rino 25.10.2012 / 20:52

6 respostas

6

Eu sei que isso é um pouco exagerado, mas isso funcionará sempre (mesmo que haja espaços no seu nome de arquivo) e independentemente de como o arquivo exibe as informações.

find . -name '*.png' -exec file {} \; | sed 's/\(.*png\): .* \([0-9]* x [0-9]*\).*/ /' | awk 'int($1) > 500 {print}'

e imprime as dimensões da imagem e do arquivo

explicação:

  1. find todos os arquivos com o nome * .png em. e para cada um faça um arquivo nele

  2. use sed para imprimir apenas o nome do arquivo e as dimensões e, em seguida, reordene para imprimir as dimensões primeiro

  3. use awk para testar o primeiro número (altura da foto), certificando-se de que seja maior que 500 e se são dimensões de impressão e nome do arquivo, se não fizer nada.

por 25.10.2012 / 22:02
9
exiftool -q -r -ext png -if '$ImageHeight > 500' -p '$Directory/$FileName' .
    
por 25.10.2012 / 23:32
5

Eu sinto que algo diferente de utilitários de shell seria mais apropriado, por exemplo, Perl:

#!/usr/bin/perl

use File::Find;
use Image::Info qw(image_info dim);

find (\&check_height, './');

sub check_height {

  my $info = image_info( $_ );
  my ($width, $height) = dim( $info );
  print $_ . " has height $height\n" if ( $height > 500 );

}

Menos dicking ao tentar analisar $ 7; é só pegar as dimensões diretamente. Sim, você precisará do módulo Image :: Info, mas, no CentOS / RHEL, é um pacote padrão, portanto você pode executar apenas yum install perl-Image-Info .

    
por 25.10.2012 / 22:45
4

Você também pode usar identify do ImageMagick:

find . -name \*.png -print0|xargs -0 identify -format '%h %f\n'|
awk '$1>500'|cut -d' ' -f2-

Ou no OS X:

mdfind 'kMDItemFSName=*.png&&kMDItemPixelHeight>500' -onlyin .
    
por 27.04.2014 / 07:45
0
find . -name '*.png' -exec file "{}" \+ | awk -F"(: +PNG image data|,| x )" '$4 > 500 {print $4" "$1}'
    
por 25.10.2012 / 20:56
0

Esta solução também funcionará. A última parte do código ( mv "$img" ./lowpixel ) moverá os arquivos abaixo de uma largura e altura especificadas para uma pasta. No exemplo a seguir, todas as imagens jpg com menos de 300x300 serão movidas para uma pasta chamada lowpixel :

find -iname \*.jpg | while read img; do anytopnm "$img" | pamfile | perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || mv "$img" ./lowpixel; done

    
por 10.07.2016 / 22:01