Описание скрипта в листинге.
И два вопроса:
1. Есть строка которая парсит название файла "выкусывая" оттуда определенный фрагмент (ID архива). В регулярном выражении явно задано расширение (7z). Однако хотелось бы его задавать переменной $ARCEXT. когда подставляю перестает работать эта команда
Код: Выделить всё
OLDID=`echo $OLDFILE | sed -rn 's/[a-zA-Z]+[0-9]+_([0-9]{2}).7z/\1/p'`;
2. Есть строка которая ищет файлы новее заданного и помещает их в архив, а так же выводит имя файла на экран. find возвращает найденные файлы начиная с "./". Но архиватор (7z) если получает имя файла в таком виде, то помещает в архив без относительного пути. Т.е. мне приходится в этой же строке убирать "./" и тогда архиватор сохраняет вложенные каталоги (если найденный файл находится в них).
В итоге это строчка получилась довольно громоздкой. Вчитывался в маны 7z, find, sed, xargs - лучше решения не нашел. Есть ли оно?
Код: Выделить всё
find ./ -type f -cnewer ../$OLDFILE | while read i; do (echo $i;echo $i | sed -rn 's/\.\///p' | xargs -i $ARCLINE ../$NEWFILE '{}' > /dev/null \;) done;
Весь скрипт полностью
Код: Выделить всё
#!/bin/sh
# Скрипт архивирования каталога и обновлений
# Версия: 1.1 от 31-03-2010
# Автор: Воробьев Александр
# url: http://va-soft.com/
#
# Скрипт формирует два архива:
# 1. Полный архив каталога с именем <dir><date>
# 2. Архив новых файлов с момента предыдущего архивировния с именем <dir><date>_<id>
# В именах файлов:
# <dir> - имя родительского каталога
# <date> - дата архива в формате YYYYMMDD (год 4 знака, месяц 2 знака, день 2 знака)
# <id> - порядковый номер архива 2 знака
# Если предыдущий архив обновлений отсутствует, то он создается копированием полного архива
# После создания архива обновлений старый архив обновленй удаляется
#
# Пример дерева каталогов
# myproject/ - родительский каталог
# myproject/site/ - целевой каталог для архивирования
# myproject/site/samefile.css
# myproject/site/samefile.html
# myproject/myproject20100101.7z - полный архив каталога
# myproject/myproject20100101_02.7z - архив обновлений
# myproject/news.sh - данный скрипт
# Команда архивирования
ARCLINE="7z a -R";
# Расширение архивов
ARCEXT="7z";
# Целевой каталог для архивирования
SUBDIR="site";
CURDIR=`pwd | sed -rn "s/.*\/([^\/]*)$/\1/gp"`;
CURDATE=`date +%Y%m%d`;
OLDFILE=`find . -type f -name $CURDIR????????_??.$ARCEXT | sed -r 's/\.\///'`
cd $SUBDIR;
$ARCLINE ../$CURDIR$CURDATE.$ARCEXT > /dev/null
if [ "$OLDFILE" == "" ]
then
cp ../$CURDIR$CURDATE.$ARCEXT ../$CURDIR${CURDATE}_01.$ARCEXT
else
OLDDATE=`echo $OLDFILE | sed -rn 's/[a-zA-Z]+([0-9]+).*/\1/p'`;
if [ "$OLDDATE" == "$CURDATE" ]
then
OLDID=`echo $OLDFILE | sed -rn 's/[a-zA-Z]+[0-9]+_([0-9]{2}).7z/\1/p'`;
NEWID=`expr $OLDID + 1`
else
NEWID=1;
fi
NEWFILE=`printf "%s%s_%02d.$ARCEXT" $CURDIR $CURDATE $NEWID`;
# Старый вариант find ./ -type f -cnewer ../$OLDFILE | while read i; do (echo $i;echo $i | sed -rn 's/\.\///p' | xargs -i $ARCLINE ../$NEWFILE '{}' > /dev/null \;) done;
find ./ -type f -cnewer ../$OLDFILE -printf "%P\n" | while read i; do (echo $i; $ARCLINE ../$NEWFILE $i > /dev/null \;) done;
if [ -f ../$NEWFILE ]
then
rm ../$OLDFILE;
fi;
fi;
cd ..;
upd Исправлена самая длинная строка благодаря наводке drBatty