Pull to refresh

Скрипт для обработки фотографий: unix-way среди нас

Configuring Linux *
Добрый вечер, хабровчане!

Начну с того, что работаю я в непростой школе простым лаборантом. На мне висит много всяких обязанностей, одной из которых является пополнение школьного сайта и ресурса oshkole.ru контентом.
Часто приходится выкладывать на этот ресурс фотографии. Но так как написан он о-очень криво (к слову, ведение там странички школы обязательно и контролируется прокуратурой), фотографии конечному пользователю подгружаются в полном размере. Вот и приходится ресайзить по ~30 штук в неделю.

Так как я любительница unix-way, быстро пришла идея написать bash скрипт.

Была поставлена цель: легко и непринужденно изменять размер всех изображений в директории. Задача достаточно тривиальная, скриптик был набросан за 5 минут, и… Тут меня осенило: я ведь так давно хотела написать статью на хабр, только было неочем. И вот я здесь =)

Всем, кому еще не стало скучно, добро пожаловать под кат.


Итак, приступим.



Само изменение размера будем осуществлять утилитой convert из набора ImageMagick. Сразу оговорюсь, что эта утилитка очень мощная (а сам ImageMagick и того мощнее) и с ее помощью можно делать очень много всего.
> convert image_in.jpg -resize 1228800@ image_out.jpg
Здесь я использую опцию -resize 1228800@. Она означает, что изображение будет иметь площадь в 1228800 пикселей (соответствует разрешению 1280х960). Разумнее использовать здесь именно эту опцию потому, что фотографии могут быть как вертикальной ориентации, так и горизонтальной. Подробнее о возможностях изменения размера изображений можно посмотреть здесь.

На этом этапе возникла мысль делать это не только для себя =).

Так, для начала нужно проверить, есть ли на машине convert. Сделаем это так:
convert > /dev/null
if [ $? -ne 0 ]; then echo "Error: convert is needed, it's a part of ImageMagick"; fi;

Поясню запись «if [ $? -ne 0 ]»:
Скобка "[" соответствует команде test, и про нее можно почитать в man test (1). В $? хранится результат выполнения предыдущей команды. Например, если выполнение было успешно, там будет 0, а если команда не была найдена — 127. Закрывающая скобка "]" выполняет лишь эстетическую функцию.

Далее. Существует небольшая проблемка — бывает, пользователь указывает в конце адреса "/", например: /home/user/. Как этот слэш убрать человеческим методом, я не нашла, поэтому придумала детский трехколесный:
if [ -z $1 ]; then $DIR=`pwd`;
else
  TEMP=`pwd`;
  cd $DIR; TEMP2=`pwd`;
  cd $TEMP;
  DIR=$TEMP2;
  echo $TEMP2;
fi;

Заодно здесь решаем использовать текущую директорию, если аргумент не дан.

Копируем старые файлы...:
mkdir "$DIR.old";
for i in `ls $DIR`;
do
  cp $DIR/$i $DIR.old;
done

Для тех, кто не очень понимает «for i in...» советую посмотреть тут.

Ну и самое главное:
for i in `ls $DIR`;
do
  convert $DIR/$i -resize 1228800@ $DIR/$i;
  if [ $? -eq 0 ]; then
    echo "$i successfully resized";
  else k=$[$k+1]; #считаем ошибки
  fi;
done

Думаю, на этом этапе все должно быть понятно.

Итак, долгожданный момент: собираем все вместе. Файл можно скачать здесь.
#!/bin/sh <br><br>
#проверяем, установлен ли convert<br>
convert > /dev/null<br>
if [ $? -ne 0 ] ; then <br>
  echo "Error: convert is needed, it's a part of ImageMagick" ;<br>
fi;<br>
DIR=$1;<br>
# велосипед, убирающий "/" в конце <br>
if [ -z $1 ]; then $DIR=`pwd`; <br>
else<br>
  TEMP=`pwd`;<br>
  cd $DIR; TEMP2=`pwd`; <br>
  cd $TEMP;<br>
  DIR=$TEMP2;<br>
  echo $TEMP2;<br>
fi; <br>
#наши старые файлы копируем в DIR.old<br>
mkdir "$DIR.old";<br>
for i in `ls $DIR`; <br>
do<br>
  cp $DIR/$i $DIR.old;<br>
done;<br>
ERR=0;<br>
echo "Start resizing to 1280x960...." <br>
for i in `ls $DIR`;<br>
do<br>
  convert $DIR/$i -resize 1228800@ $DIR/$i;<br>
  if [ $? -eq 0 ]; then <br>
    echo "$i successfully resized"; <br>
  else ERR=$[$ERR+1]; #считаем ошибки<br>
  fi;<br>
done;<br>
if [ $ERR -eq 0 ]; then <br>
  echo "Job done!";<br>
else echo "Job done with some errors.";<br>
fi;<br>
echo "You can find your old files in $DIR.old"<br>
#end




Как запустить скрипт


Допустим, скрипт с именем «image» лежит у вас в папке /data/scripts, а фотографии, подлежащие обработке — в /data/foto.
Тогда выполняем команду
> /data/scripts/image /data/foto
И, ура!
Только не забываем дать скрипту права на исполнение:
> chmod +x /data/scripts/image

Выводы


Все, как видим, очень легко и просто. В unix-way нет ничего плохого. Да что там, есть много чего хорошего! Я пользуюсь этим скриптом (теперь) каждый день, плюс еще несколькими скриптами для работы с сетью. И дам вам добрый женский совет: автоматизируйте! =)

Пишу на хабр впервые, сильно не бейте
Tags:
Hubs:
Total votes 112: ↑91 and ↓21 +70
Views 5.2K
Comments 165
Comments Comments 165

Posts