Пакетное изменение размеров картинок

Для следующей (будущей) заметки мне потребовалось с больших картинок сделать превьюшки. Такое часто требуется (и не только для блогинга) да и свободная минутка выпала. Писать почему-то захотелось на shell, тем более я его незнаю, но с каждым днём количество скриптов растёт.
Сначала я пошёл по простому пути: методом написания скрипта на один раз, тоесть при следующем исползовании пришлось бы править скрипт и т.д. Идея проста и подсказана была мне (даже не подсказана, а тупо дан кусок кода) mike shigorin. Вопрос был сформирован чуть по-другому. Приведу кусок переписки так там затрагивается вопрос массовой раздачи прав на файлы.
>Если уж заговорили о работе chmod, то хотел бы у тебя спросить.
>Вот иногда мне нужно устанавливать права на все файлы + файлы подкаталогах.
>И вот чтобы установаить например права 755 я пишу>chmod 755 /path/ -R
>Но, как известно, это сделает невозможным заход в каталоги. как
>сделать так , чтобы акталогам ещё и +x давало?
Это тебе как раз сделает +x, а если имел в виду 644 — тоfind /path -type f | while read i; do chmod 644 “$i”; done
(не совсем пуленепробиваемая форма — с именами, которые содержат
перевод строки, не справится, но для пробелов достаточно; более
надёжный вариант для скриптов должен использовать find -print0)—- WBR, Michael Shigorin <**********>
—— Linux.Kiev http://www.linux.kiev.ua/
Надеюсь суть письма понятна: хотел я красиво права на файлы раздавать. На базе этого решил и писать строчку скрипт
В общем задача: В каталоге лежат множество картинок большого размера. Следует в каталог small/ загнать картинки с таким же именем но размером по ширине 400 пикселей.
Сначала был интерпретирована строчка Шигорина под мои нужды. Следует сказать, что изменяет размер картинки команда convert с пакета,кажется, ImageMagic. Формат таков:
Usage: convert [options ...] file
А если в options поставить -resize geomety, то получим уже урезаную картинку. Не сильно замарачиваясь написал что-то похожее до:
find /path -type f | while read i; do convert "$i" -resize 400 "small/$i"; done
Что странно – заработало! Конечно, куча варнингов и багов, но – сработало! Но как это всё грусно и не переносимо. Решил тратить время на нормальный скрипт.
Использовать тоесть вызывать мы скрипт будем с одним обязательным параметром (путь к каталогу, где у нас скопом лежат картинки) и вторы, не обезательным, шириной маленькой картинки.
wert2all@webdev:~/scripts> ./resize_pic.sh ~/tmp/blog 400
Второй параметр, как я уже сказал, не обезательный и он по-умолчанию равняется 400. Это я так хочу!!!
В самом скрипте следует проверить как запусчен скрипт. Ну обезательный параметр, ну и существование такой директори.
if ! [ -z $1 ]; then if [ -d $1 ]; then
# всё нормально, работаем
else
echo 'Path not exist'
fi
else
echo 'Enter path'
fi
Первый условный оператор проверяет на наличие в коммандной строке обязательного первого параметра, а второй if – на существование такого каталога.
Проверяем второй параметр и если его нет, то сделаем по-умолчанию:
if [ -z $2 ]; then resize=400
else
resize=$2
fi
Теперь создаём папку small/ если же её нет:
if ! [ -d $1"/small/" ]; then mkdir $1"/small/"
fi
А теперь перебираем все файлы с расширением .gif, .png и .jpg и конвертируем.
for i in `ls $1 | grep '[gif|png|jpg]'` do
convert $1/$i -resize $resize $1/small/$i
echo "Done "$i"..."
done
Весь вкрипт маленький, но мне для пакетной обработки фоток понадобиться. Надеюсь и кому-то тоже (что врядли
)
#/usr/bin/sh
# resize pictures in directory
#
#
# usage: path_to_dir [resize geometry]
if ! [ -z $1 ]; then
if [ -d $1 ]; then
if [ -z $2 ]; then
resize=400
else
resize=$2
fi
if ! [ -d $1"/small/" ]; then
mkdir $1"/small/"
fi
for i in `ls $1 | grep '[gif|png|jpg]'`
do
convert $1/$i -resize $resize $1/small/$i
echo "Done "$i"..."
done
else
echo 'Path not exist'
fi
else
echo 'Enter path'
fi
Так как в текстовом виде скрипт ужасен – выложено.


ну, в общем, ниасилил текст полностью, но понял, что ты тусуешь с крутыми папками из липукс.киев.юэй.
Круто!
А я в камментах буду переназывать тебя в “Флеймер”, можна?
без питань