1
0
Fork 0
dispatcher/creativity.sh
2025-02-23 09:04:08 +03:00

51 lines
4.5 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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"