Как найти все изображения с определенным размером пикселя с помощью командной строки?

Я пытаюсь найти все изображения 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 во-первых, проверить, что он не находит то, что вы хотите сохранить, иначе он не будет запрашивать вас перед удалением).

Другие вопросы по тегам