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

Я пытаюсь найти все изображения JPG в папке с подпапками, ширина или высота которых не превышает 300 пикселей.

Таким образом, я хочу обнаружить старые миниатюры и удалить их.

Конечно, я могу найти все изображения, используя find:

find . -iname "*.jpg" -type f | ...

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

16
задан 9 January 2013 в 19:20

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 ], тогда будет напечатан только третий столбец.

0
ответ дан 9 January 2013 в 19:20

Это сработало для меня:

find . -iname "*.png" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '75x75'

Это выходная выборка:

./ 2520161636481000.png 75x75

./ 2620160819191100.png 75x75

./ 2420181545550700.png 75x75

0
ответ дан 9 January 2013 в 19:20

Я думаю, что принятый ответ очень хорош, но я хотел добавить еще одно возможное решение ...

Хотя я сам использую инструменты ImageMagick чаще всего, сейчас netpbm - старый друг для обработки изображений. Вы можете увидеть размер любого формата изображения с помощью команды:

anytopnm file | pamfile

Это сгенерирует вывод, который выглядит следующим образом:

stdin:  PPM raw, 1650 by 1275  maxval 255

Чтобы ответить на вопрос «что следует после pipe? ", я использую 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
0
ответ дан 9 January 2013 в 19:20

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

0
ответ дан 9 January 2013 в 19:20

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

Похожие вопросы: