2

Я пытаюсь найти способ сделать следующее (Google возвращает результаты только для поиска):

  1. Переместить все изображения с типом файла (.jpg, .png или .gif и т.д.) Заданного размера (ов) (например, 1920x1080, шириной менее 1600 и т.д.) Из текущего каталога в другой каталог.

  2. Удалить все изображения указанных размеров в текущем каталоге.

1 ответ1

2

Это переместит все файлы jpg, png или gif размером 1920x1080 из текущего каталога в targetdir:

#!/bin/bash
shopt -s nullglob
for fname in *.jpg *.png *.gif
do
    read width height < <(exiv2 "$fname" 2>&1 | awk '/^Image size/{print $4,$6}')
    [ "$width" ] || continue
    [ "$width" -eq 1920 ] && [ "$height" -eq 1080 ] && mv "$fname" targetdir/
done

Это просматривает текущий каталог и удаляет все изображения jpg, png или gif шириной менее 1600:

#!/bin/bash
shopt -s nullglob
for fname in *.jpg *.png *.gif
do
    read width height < <(exiv2 "$fname" 2>&1 | awk '/^Image size/{print $4,$6}')
    [ "$width" ] || continue
    [ "$width" -lt 1600 ] && rm "$fname"
done

При этом используется утилита захвата изображения exiv2 . В Debian-подобной системе exiv2 можно установить, запустив apt-get install exiv2 . С незначительными изменениями, аналогичными утилитами, такими как ImageMagick - х identify могут быть использованы.

Этот скрипт требует bash .

Как это устроено

  • shopt -s nullglob

    Игнорировать отсутствующие типы файлов.

  • for fname in *.jpg *.png *.gif; do

    Это запускает цикл для всех файлов в каталоге, имена которых заканчиваются на .jpg , .png и .gif .

  • read width height < <(exiv2 "$fname" 2>&1 | awk '/^Image size/{print $4,$6}')

    Это использует утилиту exiv2 для извлечения размера изображения. Поскольку exiv2 производит несколько строк вывода, awk используется для выбора необходимой нам информации.

  • [ "$width" ] || continue

    Если мы не восстановили размер изображения из приведенной выше команды, пропустите этот файл. Это произойдет, если, например, файл на самом деле не был файлом изображения.

  • [ "$width" -lt 1600 ] && rm "$fname"

    Если ширина изображения соответствует нашему условию, выполните rm чтобы удалить файл.

  • done

    Это сигнализирует об окончании цикла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .