Найти изображения по размеру: найти / файл / awk


9

Я пытался найти файлы изображений PNG определенной высоты (более 500 пикселей). Я знаю, что fileвернет размеры изображения. Пример:

$ file TestImg1a.png

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

Но мне нужно использовать это, чтобы найти все файлы в каталоге с высотой более 500 пикселей. Я знаю, как распечатать все файлы независимо от высоты:

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

Но как мне ограничить 7 долларов до тех результатов, которые превышают 500?

Ответы:


7

я знаю, что это немного излишне, но это будет работать каждый раз (даже если в вашем имени файла есть пробелы) и независимо от того, как файл отображает информацию.

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

и он печатает размеры изображения и файла

объяснения:

  1. findвсе файлы с именем * .png под. и для каждого сделайте на нем файл

  2. используйте sedдля печати только имени файла и размеров, затем измените порядок печати размеров

  3. используйте, awkчтобы проверить первое число (высоту рис.), убедившись, что оно больше 500, и если это размеры печати и имя файла, если нет, ничего не делайте.


Спасибо. Я должен был сделать небольшое изменение - от $ 1 в аргументе awk до $ 3. Но это определенно для меня.
Стив Эр-Рино


5

Я чувствую, что что-то, кроме утилит оболочки, будет более подходящим, например, 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 );

}

Меньше возиться с попытками разобрать 7 долларов; просто получите размеры напрямую. Да, вам понадобится модуль Image :: Info, но в CentOS / RHEL это стандартный пакет, так что вы можете просто запустить yum install perl-Image-Info.


1
Хотя perl обычно отличное решение, в данном случае это не так, особенно если у меня нет ни Image :: Info, ни возможности установить.
Стив-Эр-Рино

1
Perl-решение несколько быстрее, чем find / file / awk, что приятно, и в Ubuntu-производных модуль информации об изображениях доступен сapt-get install libimage-info-perl
rivimey

5

Вы также можете использовать identifyиз ImageMagick:

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

Или в OS X:

mdfind 'kMDItemFSName=*.png&&kMDItemPixelHeight>500' -onlyin .

0
find . -name '*.png' -exec file "{}" \+ | awk -F"(: +PNG image data|,| x )" '$4 > 500 {print $4" "$1}'

не работает:96, ./4/45445106_w185.png: 86, ./4/404358x_w185.png: 86, ./4/404341x_w185.png: 80, ./4/475986_w185.png: 621, ./4/481693_w185.png: 667, ./4/42513x_w185.png: 86, ./4/404372x_w185.png:
Стив-Эр-Рино

@tink, приведите $ 7 к int до сравнения, то есть int ($ 7)> 500 .. при отсутствии приведения awk прибегает к буквальному сравнению строк
iruvar

Стив, откуда это "," откуда? Мой "файл" не производит это. Но, как сказал Чандра: вы можете явно заставить $ 7 стать целым числом, используя метод, указанный в его комментарии.
Тинк

ваш оператор awk будет работать только в том случае, если в имени файла нет пробелов
h3rrmiller

@tink "," является частью того, что файл возвращает в моей среде.
Стив-Эр-Рино

0

Это решение также будет работать. Последняя часть кода ( mv "$img" ./lowpixel) будет перемещать файлы ниже указанной ширины и высоты в папку. В следующем примере все изображения jpg размером менее 300x300 будут перемещены в папку с именем 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.