Пакетная оптимизация изображений с копированием результата. На сервере

На web-сервере имеется многоуровневая структура каталогов с jpg-изображениями. Нужно их оптимизировать, сохранив оптимизированные в новом каталоге соблюдая исходную структуру.

Например, исходная структура:

img/vesna/gorod/2020/
img/vesna/les/2020/
img/vesna/pole/2020/
img/leto/gorod/2020/
img/leto/les/2020/
img/leto/pole/2020/

Оптимизированные нужно сложить в

imgopt/vesna/gorod/2020/
imgopt/vesna/les/2020/
imgopt/vesna/pole/2020/
imgopt/leto/gorod/2020/
imgopt/leto/les/2020/
imgopt/leto/pole/2020/

Подскажете как это сделать непосредственно на сервере? SSH доступ имеется.

PS. Насколько я нагуглил jpegoptim может сложить все в один каталог, а надо раскидать соответственно исходному расположению. Или же я не нашел как им это провернуть.


Ответы (1 шт):

Автор решения: eri
pushd ./images/

find . -name \*.jpg -type f -print0 |
while IFS= read -r -d '' src; do 
  dest=../imgopt/$(dirname "$src")
  mkdir -p "$dest"
  jpegoptim --force --dest="$dest" "$src"
done

popd

Перейдем в папку с картинками чтоб получать относительные пути в find.

find просто выводит список файлов с разделителем \0 - это нужно чтоб пробелы в именах файлов не сломали список.

Дальше хитрый read, который читает этот путь в переменную по разделителю \0

dirname уберет имя файла из пути - выйдет ../imgopt/./vesna. точка не проблема - линукс её отработает.

Создали папку и пишем jpegoptim с выхлопом в эту папку. --force чтоб уже оптимизированные файлы не пропустить.

→ Ссылка