52 lines
4.5 KiB
Bash
52 lines
4.5 KiB
Bash
|
#!/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"
|