Я пытаюсь найти все изображения JPG в папке с подпапками, ширина или высота которых не превышает 300 пикселей.
Таким образом, я хочу обнаружить старые миниатюры и удалить их.
Конечно, я могу найти все изображения, используя find
:
find . -iname "*.jpg" -type f | ...
Но что следует за каналом? Какой пакет я могу использовать для определения атрибутов изображения?
Вы можете использовать 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
Чтобы ответить на вопрос «что следует после 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
Команда 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
он не найдет вещи, которые вы хотите сохранить - в противном случае он не будет запрашивать вас перед удалением).