Как найти все изображения с определенным размером пикселя с помощью командной строки?
Я пытаюсь найти все изображения JPG в папке с подпапками, которые имеют ширину или высоту ниже 300 пикселей.
Таким образом, я хочу обнаружить старые эскизы и удалить их.
Конечно, я могу найти все изображения, используя find
:
find . -iname "*.jpg" -type f | ...
Но что следует за трубой? Какой пакет я могу использовать для определения атрибутов изображения?
4 ответа
Ты можешь использовать identify
от imagemagick
и вы можете использовать следующую команду:
find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '$1<300 || $2<300'
использование -exec <command> '{}' \;
убедитесь, что ваше имя файла может содержать пробелы, или вы можете использовать
find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300'
где -I{}
заботится о том же.
Что мне нравится в identify
в том, что вы можете указать формат вывода; в этом случае '%w %h %i'
который дает ширину, высоту и полный путь к изображению. Тогда awk
Выражение сохраняет только те строки, для которых изображение меньше желаемого размера.
Пример вывода:
64 64 ./thumbsup.jpg
100 150 ./photomin.jpg
Редактировать: если вы хотите только имена файлов (для rm
например), просто поменяй $line
в awk
заявление к $3
, тогда будет напечатан только третий столбец.
Это сработало для меня:
find . -iname "*.png" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '75x75'
Это выходной пример:
./2520161636481000.png 75x75
./2620160819191100.png 75x75
./2420181545550700.png 75x75
Я думаю, что принятый ответ очень хорош, но я хотел добавить другое возможное решение...
Хотя я пользуюсь ImageMagick
инструменты чаще всего сейчас сам, netpbm
старый друг для обработки изображений. Вы можете увидеть размер любого формата изображения с помощью команды:
anytopnm file | pamfile
Это сгенерирует вывод, который выглядит так:
stdin: PPM raw, 1650 by 1275 maxval 255
Чтобы ответить на вопрос "что следует за трубой?", Я использую while read
чаще, чем я использую xargs
потому что это более гибкий. мой netpbm
Ответ на вопрос выглядит так:
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
identify
команда от imagemagick
Пакет делает то, что вы хотите:
$ identify abc.jpg
abc.jpg JPEG 1952x3264 1952x3264+0+0 8-bit DirectClass 1.111MB 0.000u 0:00.000
Опять же, вам нужно будет затем использовать grep
отсортировать по размеру изображения.
Тем не менее, я подозреваю, что если у вас нет очень широкого диапазона размеров изображений, было бы проще просто использовать find
чтобы удалить файлы JPEG ниже заданного размера:
find -iname '*.jpg' -size -10k -delete
(Стоит бежать без -delete
во-первых, проверить, что он не находит то, что вы хотите сохранить, иначе он не будет запрашивать вас перед удалением).