#!/bin/bash echo "Создание уменьшенных копий изображений 'jpg' в каталогах 'creativity*'." #-----------------------------------------------------------------------------------------------; prompt="Подтверждение (да/нет): " && read -erp "$prompt" line && echo -ne "\033[1A$prompt\033[K" case "${line,,}" in y | yes | д | да) echo "ПОДТВЕРЖДЕНИЕ" ;; *) echo "ОТМЕНА" && exit 0 ;; esac #-----------------------------------------------------------------------------------------------; time_ms="$(date '+%s%3N')" # текущее время в миллисекундах #-----------------------------------------------------------------------------------------------; # файл-отчёт о завершении работы функции, удаление старого файла export logfile="$PWD/logs/creativity.log" && rm -f "$logfile" #-----------------------------------------------------------------------------------------------; # обработка изображений function graphics_magick { dir="$2" && file="${3%.*}.webp" folder="${dir/full-size/preview}" # уменьшение размеров изображения — не более 500 пикселей по горизонтали gm convert "$dir/$3" -resize 512!x\> -strip -quality 90% "$folder/$file" &>>/dev/null # отчёт о завершении выполнения функции echo "$dir/$3" >>"$logfile" # соответствующая строка для текущего каталога pre="\e[${1}A" && aft="\e[K\e[${1}B\r" # массив общего количества файлов и цвета для его отображения read -ra array <<<"$count" && green="\e[92m" && norm="\e[0m" # текущее значение и общее значение для текущего каталога и для всех каталогов current_dir="$(grep -c "^$dir" "$logfile")" && total_dir="${array[$1]}" current_all="$(grep -c "." "$logfile")" && total_all="${array[0]}" [ "$current_dir" == "$total_dir" ] && file="${dir}" || file="${dir}/$3" [ "$current_dir" == "$total_dir" ] && c1="$green" || c1="$norm" [ "$current_all" == "$total_all" ] && c2="$green" || c2="$norm" printf "${pre}Обработано: [${c1}%d/%d${norm}] %s${aft}" "$current_dir" "$total_dir" "$file" printf "Всего обработано файлов: [${c2}%d/%d${norm}]\r" "$current_all" "$total_all" } export -f graphics_magick cd .. # выход из репозитория # поиск всех каталогов "full-size" репозиториев "creativity*", сортировка и добавление порядковых номеров для строк readarray -t folders < <(find . -type d -path "*creativity*/full-size" -printf '%p\n' | sort -r | grep -n '\S') export count # строка-массив общего количества изображений "jpg" в каждом каталоге "full-size" для дочерних процессов count="$(printf 'find %s -type f -name "*.jpg" | wc -l\0' "${folders[@]#*:}" | xargs -n1 -0 bash -c | tr '\n' ' ')" # общее количество файлов во всех каталогах "full-size" count="$(echo "$count" | numsum -r) $count" # смещение курсора вниз на соответствующее количество строк printf 'Каталог: %s\n' "${folders[@]#*:}" | sort # строка замены путей для каталогов "full-size" на такие же с порядковыми номерами replace="sed $(printf "%s\n" "${folders[@]}" | sed -E "s/(.+):(.+)/-e 's|\"\2\"|\"\1\" \"\2\"|g'/" | tr '\n' ' ')" # запуск параллельной обработки изображений "jpg" в каталогах "full-size" репозиториев "creativity*" find . -type f -path "*creativity*/full-size*" -name "*.jpg" \ -printf 'graphics_magick "%h" "%f"\0' | eval "$replace" | xargs -n1 -0 -P0 bash -c #-----------------------------------------------------------------------------------------------; # замер продолжительности выполнения в миллисекундах, пересчёт в минуты, секунды и миллисекунды tms="$(($(date '+%s%3N') - time_ms))" && min="$((tms / 1000 / 60))" && sec="$((tms / 1000 % 60))" ms="$((tms % 1000))" && printf '\nОбщее время выполнения: %02d:%02d.%03d мс.\n' "$min" "$sec" "$ms"