команда для печати изображений размером в пиксель в каталоге

#linux #shell #command-line

Вопрос:

можно ли перечислить все изображения в каталоге, размер которых в пикселях больше или меньше x? Я нашел эту команду в другом потоке

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

эта команда хорошо работает для *.png, но в тот момент, когда я изменяю ее на *.jpg, результаты становятся слишком сумасшедшими. смотреть ниже. Я хотел бы записать результаты в файл журнала, чтобы позже я мог удалить эти изображения из своего каталога продуктов.

*.вывод в формате png

 50 x 50 ./data/catalog/agsquare.png
220 x 138 ./data/catalog/brickwall_@2X.png
3 x 3 ./data/catalog/dots.png
98 x 98 ./data/catalog/grid-noise.png
 

*вывод jpg (размер пикселя игнорируется, что-то явно не так с этой командой)

 ./data/background/fashion-shirt.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 1920x1440, frames 3
./data/background/grey-bag.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 1920x1280, frames 3

 

ОС: Ubuntu 18.04.5 LTS

Ответ №1:

file выходные 1 x 2 данные для PNG, но 1x2 для JPEG. Ваша команда ожидает пробелов.

Вместо этого используйте инструмент, например identify , из ImageMagick, который может делать это независимо от формата:

 find . ( -name '*.jpg' -o -name '*.png' ) 
    -exec identify -format '%w %h %in' {}   |
    awk '$1 < 250'
 

Комментарии:

1. Я думаю, вам нужно %f скорее, чем %F .

2. %f является только именем файла, %F включает в себя путь

3. Больше нет, я думаю… imagemagick.org/script/escape.php

4. Интересный. %f терпит неудачу на моем 6.9.11-24. Какую версию вы используете?

5. Я на v7.1.0-5

Ответ №2:

Для того, чтобы от простого к более тяжелому весу, у вас есть несколько вариантов:

  • feh
  • exiftool
  • ffprobe — маленький друг ffmpeg
  • ImageMagick identify

Согласно репозиторию пакетов Ubuntu, вы должны были feh установить Ubuntu 18 LTS, чтобы вы могли использовать:

 feh -L "%f:%w:%h"  *.jpg *.png
 

Пример Вывода

 small.png:10:10
red.jpg:8:8
redhat.jpg:254:255
 

Примечание feh также принимает —min-dimension и —max-dimension в качестве фильтров. Итак, для всех изображений шириной более 640 пикселей используйте:

 feh --min-dimension 640x0 -L "%f:%w:%h"  *.jpg *.png
 

Вы также можете использовать exiftool для поиска и печати изображений высотой или шириной менее 100 пикселей, таких как это:

 exiftool -p '$filename:$imagewidth:$imageheight' -if '$imagesize and ($imagewidth<100 or $imageheight<100)' -q *.jpg *.png
 

Пример Вывода

 black.jpg:8:8
red.jpg:8:8
small.png:10:10
 

Если вы используете любую «операционную систему», происходящую из Редмонда, замените одинарные кавычки двойными кавычками.

Обратите внимание, что exiftool это значительно меньшая установка, чем ImageMagick.


Ubuntu 18 LTS также должен включать ffmpeg в себя и своего маленького друга ffprobe , так что вы можете это сделать:

 ffprobe -v error -select_streams v -show_entries stream=width,height  -of csv=p=0:s=x IMAGEFILE
 

Или с помощью ImageMagick используйте это для поиска изображений с шириной:

 magick identify -format '%f:%w:%hn' *png *jpg | awk -F: '$2<100'
 

Ответ №3:

благодаря другому парню я удалил пробелы вокруг x, и это сработало. не упомянул, что я не хотел использовать какой-либо инструмент, другие команды не могли быть найдены на моем сервере.

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