#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}'