<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="article.xsl"?>
<article lang="ru">
        <meta>
                <title>Saving Backups Of Small Projects</title>
        </meta>
        <content>
                <head>
                        <heading>Сохранение копий небольших проектов</heading>
                        <author name="maretskiy"/>
                        <created>2009.09.08</created>
                        <updated>2009.11.21</updated>
                        <description>Допустим Вы пишете скрипт или маленький проект из нескольких файлов. Соответственно надо периодически сохранять результат своих трудов, чтобы в случае необходимости откатиться на шаг или два назад. Если для крупного проекта нужна система контроля версий, то для маленькой задачи хватит и shell-скрипта.</description>
                </head>
                <body>
                        <caption>Перед использованием:</caption>
                        <ul>
<li>для удобства разместите скрипт в пределах доступа переменной окружения $PATH</li>
<li>определите в начале скрипта переменную SAVEDIR в путь к желаемой директории хранения файлов</li>
                        </ul>
                        <prec><a href="save">save</a></prec>
                        <code>#!/bin/sh

SAVEDIR=<string>&quot;${HOME}/save&quot;</string>   <comment># where save backups</comment>
LIMIT_BYTES=1048576      <comment># set 1Mb limit</comment>

SCRIPT=<string>&quot;save&quot;</string>
VERSION=<string>&quot;20090903&quot;</string>

if test <string>&quot;${1}&quot;</string>
then
    echo <string>&quot;${SCRIPT} version ${VERSION}&quot;</string> &gt;&amp;2
    echo <string>&quot;Saves backup of whole current directory&quot;</string> &gt;&amp;2
    exit 1
fi

err()
{
    echo <string>&quot;${SCRIPT}: ERROR: ${1}&quot;</string> &gt;&amp;2
    exit 1
}

<comment>#### check save directory</comment>
test -d <string>&quot;${SAVEDIR}&quot;</string> || mkdir <string>&quot;${SAVEDIR}&quot;</string> 2&gt;/dev/null
test -d <string>&quot;${SAVEDIR}&quot;</string> || err <string>&quot;failed to create directory: ${SAVEDIR}&quot;</string>

<comment>#### check size</comment>
DIR=<string>&quot;$(basename $(pwd))&quot;</string>
DIR_SIZE_BYTES=$(du -s . | awk <string>&apos;{print $1}&apos;</string>)
test ${DIR_SIZE_BYTES} -gt ${LIMIT_BYTES} &amp;&amp; err <string>&quot;size (${DIR_SIZE_BYTES}) of ${DIR} is greater than limit of ${LIMIT_BYTES}&quot;</string>

<comment>#### saving</comment>
cd .. || err <string>&quot;FAILED&quot;</string>
tar cpzf <string>&quot;${SAVEDIR}/${DIR}.$(date +%Y%m%d%H%M%S).tar.gz&quot;</string> <string>&quot;${DIR}&quot;</string> || err <string>&quot;failed to create archive&quot;</string>
echo <string>&quot;saved: ${DIR}&quot;</string></code>
                        <p>Например у Вас открыт терминал и рабочей директорией является каталог с разрабатываемым скриптом или документом:</p>
                        <shell>$ pwd
/home/user/tmp/mysmallproject
$ ls -l
итого 12
-rwxr-xr-x 1 user users 895 2009-09-08 00:52 project.c
-rwxr-xr-x 1 user users 170 2009-09-08 00:52 project.h
-rwxr-xr-x 1 user users 865 2009-09-08 00:48 project.sh</shell>
                        <p>Тогда для создания архива директории просто наберите &quot;save&quot;:</p>
                        <shell>$ save
saved: mysmallproject</shell>
                        <p>Все, копия файлов сохранена:</p>
                        <shell>
$ ll /home/user/save/my*
-rw-r--r-- 1 user users 1,1K 2009-09-08 00:54 /home/user/save/mysmallproject.20090908005453.tar.gz</shell>
                        <p>Имя архива включает дату и время, так что файлы сортируются автоматически.</p>
                        <p>Переменная LIMIT_BYTES ограничивает максимальный размер текущей директории (рекурсивно, до архивирования). Ограничение не позволит архивировать что-то крупное.</p>
                </body>
        </content>
</article>

