forked from nn1k1kvn/resizenator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
res.sh
176 lines (148 loc) · 6.36 KB
/
res.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#!/bin/bash
# Copyright (c) 2017 Mikhail Shilov
# V 0.1.0.
# Github: https://goo.gl/RYo3ph
# Feedback: https://fb.com/miksha.happy
# Description: change resize pictures in directory
# res.sh [width] [height]
# OS: Ubuntu 14.04
# Dependent packages: imagemagick
# Install imagemagick on Ubuntu
# sudo add-apt-repository main
# sudo add-apt-repository universe
# sudo apt-get update
# sudo apt-get install imagemagick
# Необходимые доработки:
# продизинфенцировать названия файлов и добавить логирование списка поврежденных файлов
# Портировать под Mac OSX
#Проверка на наличие пакета imagemagick
PKG_OK=$(dpkg-query -W --showformat='${Status}\n' imagemagick | grep "install ok installed")
#echo Проверка на наличие пакета imagemagick: $PKG_OK
if [ "" == "$PKG_OK" ]; then
#echo "Ошибка. Требуется установить пакет imagemagick" >&2; exit 1
# если нужно установить
echo -e "Не установлен пакет imagemagick."
read -p "Установить? [Д/н] [Y/n] " -n 1 -r
echo # перевод строки
if [[ $REPLY =~ ^[YyДд]$ ]]; then
sudo add-apt-repository -y main
sudo add-apt-repository -y universe
sudo apt-get -y update
sudo apt-get -y install imagemagick
else
exit 0
fi
fi
printf "\033c" # чистим экран
# размеры по умолчанию
DW=800
DH=600
PATTERN_IMG=".*\.(PNG|JPG|JPEG|BMP)" #конвертироваться будут только файлы, соответствующие заданному шаблону.
# получаем параметры и передаем им значения по умолчанию если параметры не были переданы
w=${1:-$DW}
h=${2:-$DH}
# получаем текущую дирректорию с учетом символических ссылок
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
echo "Текущая дирректория: $DIR"
print_tab () # выводит на печать в таблицу
{
col_name1=" ФАЙЛ"
col_name2="СТАТУС "
# выводим на печать.
pad=$(printf '%0.1s' " "{1..80})
padlength=80
#Если выводим первый раз. То выводим заголовок.
if [[ $cnt -eq 1 ]]; then
printf '%0.1s' "-"{1..80}
echo
printf '%s%*.*s%s\n' "$col_name1" 0 $((padlength - ${#col_name1} - ${#col_name2} )) "$pad" "$col_name2"
printf '%0.1s' "-"{1..80}
echo
fi
printf '%s%*.*s%s\n' "$filename" 0 $((padlength - ${#filename} - ${#status} )) "$pad" "$status"
#echo -e " $status\r$filename "
}
get_sizes () # запрашивает размеры
{
echo 'Введите, пожалуйста, нужные вам размеры картинок:'
read -p "Ширина: " w
read -p "Высота: " h
w=${w:-$DW}
h=${h:-$DH}
check_wh_valid
}
check_wh_valid () # проверяет размеры на валидность
{
# проверяем размеры на валидность. Должно быть целое положительное число.
re='^0*([1-9][0-9]*)$' #'^[0-9]+$'
if ! [[ $w =~ $re && $h =~ $re ]] ; then
echo "Размер должен быть указан как положительное целое число. Попробуйте еще раз."
get_sizes
fi
}
# если параметры нам не передали
if ! [[ -n "${1}" && -n "${2}" ]] ; then
get_sizes # запрашиваем размеры
else
check_wh_valid
fi
cat << EOF
Вы указали ширину: $w высоту: $h
EOF
read -p "Всё верно? [Д/н] [Y/n] " -n 1 -r
echo # перевод строки
if [[ $REPLY =~ ^[YyДд]$ ]]
then
print_tab "ФАЙЛ" "СТАТУС"
recurse(){
for i in "$1"/*; do
#[ -f "$i" ] || continue # переход в начало цикла если не файл
#[ -d "$i" ] && echo "dir: $i" && recurse "$i" # если дирректория то выводи ее и рекрсируем
[ -d "$i" ] && recurse "$i"
filename="${i##*/}" # получаем название файла из full path
if [[ ${filename^^} =~ $PATTERN_IMG ]] # конвертируем $filename в верхний регистр и сравниваем с regex
then
((cnt++ )) # счетчик картинок
{ #try
#set +e
# проверяем файл на поврежденность. Если не поврежден, то статус OK
identify -verbose "$i" > /dev/null 2>&1 && status="OK"
} || { #catch
((cnt_corrupt++)) #счетчик поврежденных файлов
status="файл поврежден"
print_tab # выводим на печать.
continue
}
print_tab # выводим на печать.
#"2017-03-20 15.19.11 копияx.jpg JPEG 600x400 600x400+0+0 8-bit DirectClass 55.2KB 0.000u 0:00.000"
SIZE=$(identify "$i" | grep -oP "(?<=\s)(\d+x\d+)(?=\s)") # вытаскиваем размер
SIZEX=$(echo $SIZE | cut -f 1 -d 'x') # ширина
SIZEY=$(echo $SIZE | cut -f 2 -d 'x') # высота
# конвертируем
if [[ $SIZEX -ge $SIZEY ]] # >=
then
convert -size ${w}x${h} "${i}" -resize ${w}x${h} "${i}"
else
convert -size ${h}x${w} "${i}" -resize ${h}x${w} "${i}"
fi
fi
done
}
recurse "$DIR"
if [[ $cnt -eq 0 ]] # =
then
echo -e "Ошибка: В текущей дирректории не найдены файлы с изображениями." >&2; exit 1
else
echo
echo -n "Конвертация завершена. "
echo -n "Найдено $cnt картинок. "
[ -n "$cnt_corrupt" ] && echo -e "Из них $cnt_corrupt поврежденных."
exit 0
fi
fi