diff --git a/creativity.sh b/creativity.sh new file mode 100755 index 0000000..b517643 --- /dev/null +++ b/creativity.sh @@ -0,0 +1,51 @@ +#!/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"