Скрипт сжатия изображений без потери качества

Небольшой shell скрипт для пакетного сжатия без потери качества PNG и JPEG/JPG изображений.

· 1 мин.

Я заморочился оптимизацией блога, и неотъемлемой частью этого процесса является сжатие изображений. Для автоматизации процесса накидал shell.

Работает очень просто:

  1. Сначала проверяется наличие файла-флага. Он позволяет находить только новые файлы и не тратить время на обработку уже сжатых картинок (см документацию find -newer)
  2. Так как optipng, advpng, pngcrush и jpegoptim не поддерживают рекурсивную обработку файлов, то используем команду find для рекурсивного поиска изображений в папках.
  3. Сжимаем изображения.
    3.1 Дополнительной опцией является параметр ignore. В моем случае я игнорирую папку с темой Hugo.
  4. Перезаписываем файл-флаг.

В результате исходные изображения перезаписываются сжатыми.

#!/bin/bash
ignore=themes
file=script-cicd/image-optimization/optimg.flag

if [ -f "$file" ]; then
    option="-newer $file"
fi

find . -type f $option -not -path "./$ignore/*" -iname "*.png" -exec optipng -o7 {} \;
find . -type f $option -not -path "./$ignore/*" -iname "*.png" -exec advpng -z4 {} \;
find . -type f $option -not -path "./$ignore/*" -iname "*.png" -exec pngcrush -rem gAMA -rem alla -rem cHRM -rem iCCP -rem sRGB -rem time -ow {} \;
find . -type f $option -not -path "./$ignore/*" -iname "*.jpeg" -exec jpegoptim --all-progressive --strip-all {} \;
find . -type f $option -not -path "./$ignore/*" -iname "*.jpg" -exec jpegoptim --all-progressive --strip-all {} \;

touch $file
echo "$(date)" > $file