1
0
Fork 0
dispatcher/creativity.sh

52 lines
4.5 KiB
Bash
Raw Permalink Normal View History

2025-02-23 09:04:08 +03:00
#!/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"