Страница 1 из 1
Создание архивов по папкам
Добавлено: 2011-06-19 16:25:07
.scu
В shell программировании не очень сильна, поэтому нужна ваша помощь
собственно вопрос: как сделать архивы отдельно по папкам?
т.е. полный алгоритм:
1) в заданной директории получаем список папок
2) архивируем каждую папку в отдельный архив.
Пример:
базовая директория = /home/domains
директория для бекапов: /home/backups
в директории папки:
site1
site2
site3
на выходе получаем в папке /home/backups архивы:
site1.tar
site2.tar
site3.tar
заранее благодарна за помощь ^_^
Re: Создание архивов по папкам
Добавлено: 2011-06-19 17:20:04
FreeBSP
самое базовое
Код: Выделить всё
#!/bin/sh
basedir="/home/domains"
backupdir="/home/backups"
ls -l $basedir| grep -ve '^d' | awk '{print $9}' | {
while read dir;
do
taf -cjvf ${backupdir}/${dir}.tar.bz2 ${basedir}/${dir}/*
done
}
если не надо сжимать убираем опцию -j у тара
Re: Создание архивов по папкам
Добавлено: 2011-06-19 18:07:39
.scu
Большое спасибо за помощь!
Re: Создание архивов по папкам
Добавлено: 2011-06-20 7:29:33
.scu
что-то видимо не так с синтаксисом, приведенный пример не выводит директорию

(т.е. переменная директории остается пустой)
если исправить на:
Код: Выделить всё
ls -l $basedir| awk '{print $8}' | {
while read dir;
do
$dir
done
}
выводит список директорий
но если сделать полный код:
Код: Выделить всё
ls -l $basedir| awk '{print $8}' | {
while read dir;
do
tar -cjvf ${backupdir}/backup-hosting-date`'+%d-%B-%Y'`-${dir}.tar.bz2 ${basedir}/${dir} \
done
}
то все равно не работает, подскажите пожалуйста в чем ошибка
ОС Linux Suse
Re: Создание архивов по папкам
Добавлено: 2011-06-20 8:02:56
.scu
я так понимаю, что проблема в том, что while выполняется уже после того, как отработал awk, поэтому переменная dir пустая. Как сделать верно?
Re: Создание архивов по папкам
Добавлено: 2011-06-20 11:07:34
FreeBSP
на линухе все немного по другому

в частности ls -l может иметь несколько другой вывод, так что позиция папки может варьироваться. в awk соответствено ее ловить надо $8 или $9 или еще что
по поводу while read оно должно быть на той же строке
grep -e '^d' - выбирает только каталоги
Код: Выделить всё
testbed# sh scu.sh
tar -cjvf /home/backup-hosting-20-June-2011-Mk.tar.bz2 /usr/ports/Mk
tar -cjvf /home/backup-hosting-20-June-2011-Templates.tar.bz2 /usr/ports/Templates
tar -cjvf /home/backup-hosting-20-June-2011-Tools.tar.bz2 /usr/ports/Tools
tar -cjvf /home/backup-hosting-20-June-2011-accessibility.tar.bz2 /usr/ports/accessibility
........
tar -cjvf /home/backup-hosting-20-June-2011-www.tar.bz2 /usr/ports/www
tar -cjvf /home/backup-hosting-20-June-2011-x11.tar.bz2 /usr/ports/x11
tar -cjvf /home/backup-hosting-20-June-2011-x11-clocks.tar.bz2 /usr/ports/x11-clocks
tar -cjvf /home/backup-hosting-20-June-2011-x11-drivers.tar.bz2 /usr/ports/x11-drivers
tar -cjvf /home/backup-hosting-20-June-2011-x11-fm.tar.bz2 /usr/ports/x11-fm
tar -cjvf /home/backup-hosting-20-June-2011-x11-fonts.tar.bz2 /usr/ports/x11-fonts
tar -cjvf /home/backup-hosting-20-June-2011-x11-servers.tar.bz2 /usr/ports/x11-servers
tar -cjvf /home/backup-hosting-20-June-2011-x11-themes.tar.bz2 /usr/ports/x11-themes
tar -cjvf /home/backup-hosting-20-June-2011-x11-toolkits.tar.bz2 /usr/ports/x11-toolkits
tar -cjvf /home/backup-hosting-20-June-2011-x11-wm.tar.bz2 /usr/ports/x11-wm
testbed# cat scu.sh
#!/bin/sh
basedir="/usr/ports"
backupdir="/home"
ls -l $basedir | grep -e '^d' | awk '{print $9}' | { while read dir;
do
# echo taf -cjvf ${backupdir}/${dir}.tar.bz2 ${basedir}/${dir}'/*'
echo tar -cjvf ${backupdir}/backup-hosting-`date '+%d-%B-%Y'`-${dir}.tar.bz2 ${basedir}/${dir}
done
}
Re: Создание архивов по папкам
Добавлено: 2011-06-21 1:43:21
.scu
удалось решить проблему, оказалась в синтаксисе
рабочий код, вдруг кому пригодиться:
Код: Выделить всё
ls -l ${basedir} | awk '{print $8}' |
(
while read dir
do
if [ "$dir" != "." ]; then
mkdir ${backupdir}/domains-`date '+%Y-%m-%d'`
tar -zcvpf ${backupdir}/domains-`date '+%Y-%m-%d'`/${dir}.tar.gz ${basedir}/${dir}/* \
--exclude=*_log* --exclude=*.log* --exclude=/hosting/domains/${dir}/data/mod-tmp/*
fi
done
единственная проблема - кроме бекапов папок создается также бекап .tar.gz большого размера, как сделать, чтобы он не создавался, а создавались бекапы только реальных папок?
или мне как раз должна помочь опция перед awk grep -e '^d' ?
Re: Создание архивов по папкам
Добавлено: 2011-06-21 2:01:56
FreeBSP
а в чем конкретно ошибка была?
и что в том большом архиве?
Re: Создание архивов по папкам
Добавлено: 2011-06-21 4:38:38
FiL
вообще мне как-то этот ls -l |grep -e '^d' |awk не нравятся в данном случае.
В первую очередь тем, что print $8 не выведет полное имя каталога, если оно с пробелами.
Ну и как-то оно неаккуратно. Я-бы все-таки советовал find . -type d -maxdepth 1
Re: Создание архивов по папкам
Добавлено: 2011-06-30 23:19:49
.scu
FreeBSP писал(а):а в чем конкретно ошибка была?
и что в том большом архиве?
архив не распаковывала, про ошибку - видимо какая-то синтаксическая - много исправляла "по мелочи", что именно уже сложно сказать
теперь другая проблема появилась - когда скрипт запускают вручную - срабатывает на ура.
когда запускается сам по крону - не работает корректно, а именно вместо нормальных названий директорий в файлах, названия получаются вида:
Код: Выделить всё
-rw-r--r-- 1 root root 45 2011-06-30 03:10 00:49.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 01:07.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 01:46.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 03:23.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 03:24.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 03:50.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 07:45.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 08:28.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 12:32.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 13:52.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 13:56.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 13:57.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 14:00.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 14:29.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 15:27.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 16:19.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 16:35.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 16:54.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 2010.tar.gz
-rw-r--r-- 1 root root 45 2011-06-30 03:10 20:42.tar.gz
вот сам код скрипта:
Код: Выделить всё
# бекап по доменам
basedir="/hosting/domains"
backupdir="/backup/backup-date"
mkdir ${backupdir}/backup-domains-`date '+%Y-%m-%d'`
ls -l ${basedir} | grep -e '^d' | awk '{print $8}' |
(
while read dir;
do
#if [ "$dir" != "" ]; then
tar -zcvpf ${backupdir}/backup-domains-`date '+%Y-%m-%d'`/${dir}.tar.gz ${basedir}/${dir}/* \
--exclude=*_log* --exclude=*.log* --exclude=/hosting/domains/${dir}/data/mod-tmp/*
#fi
done
)
раньше с подобной проблемой не сталкивалась О_о
Re: Создание архивов по папкам
Добавлено: 2011-07-01 10:48:53
.scu
кто-нибудь может помочь решить вопрос? почему при вызове срипта вручную - файлы с архивами корректно создаются, а при запуске из крона - нет

Re: Создание архивов по папкам
Добавлено: 2011-07-02 20:48:18
FreeBSP
Код: Выделить всё
# бекап по доменам
basedir="/hosting/domains"
backupdir="/backup/backup-date"
mkdir ${backupdir}/backup-domains-`date '+%Y-%m-%d'`
find ${basedir} -type d -maxdepth 1 |
(
while read dir;
do
#if [ "$dir" != "" ]; then
mkdir -p ${backupdir}/backup-domains-`date '+%Y-%m-%d'`/
/_FULL_/_PATH_/_TO_/_TAR/tar -zcvpf ${backupdir}/backup-domains-`date '+%Y-%m-%d'`/${dir}.tar.gz ${basedir}/${dir}/* \
--exclude=*_log* --exclude=*.log* --exclude=${basedir}/${dir}/data/mod-tmp/*
#fi
done
)
Re: Создание архивов по папкам
Добавлено: 2011-07-03 18:44:07
.scu
попробуй ваш вариант, спасибо!
Re: Создание архивов по папкам
Добавлено: 2011-07-03 21:05:38
.scu
Ваш вариант не работает

, видимо потому, то вместо папки выводит путь до папки
Re: Создание архивов по папкам
Добавлено: 2011-07-05 11:28:15
.scu
Переделала Ваш пример на:
Код: Выделить всё
basedir="/hosting/domains"
backupdir="/backup/backup-date"
mkdir ${backupdir}/backup-domains-`date '+%Y-%m-%d'`
#ls -l ${basedir} | grep -e '^d' | awk '{print $8}' |
find ${basedir} -type d -maxdepth 1 | cut -c 18- |
(
while read dir;
do
tar -zcvpf ${backupdir}/backup-domains-`date '+%Y-%m-%d'`/${dir}.tar.gz ${basedir}/${dir}/* \
--exclude=*_log* --exclude=*.log* --exclude=${basedir}/${dir}/data/mod-tmp/*
done
)
(т.к. ваш не создавал архивы)
теперь проблема видоизменилась - архивы создаются (с нормальными названиями), но размер некоторых нормальных, а некоторых по 20 байт. Причем судя по дате, до какого-то момента создаются нормально, а потом уже по 20 байт. Как же все же сделать, чтобы все архивы по крону нормально создавались, в чем ошибка?
Код: Выделить всё
-rw-r--r-- 1 root root 849812 2011-07-04 03:41
-rw-r--r-- 1 root root 20 2011-07-04 03:47
-rw-r--r-- 1 root root 20 2011-07-04 03:48
-rw-r--r-- 1 root root 20 2011-07-04 03:47
-rw-r--r-- 1 root root 38916308 2011-07-04 03:42
-rw-r--r-- 1 root root 20 2011-07-04 03:47
-rw-r--r-- 1 root root 20 2011-07-04 03:48
-rw-r--r-- 1 root root 20 2011-07-04 03:47
-rw-r--r-- 1 root root 20 2011-07-04 03:47
-rw-r--r-- 1 root root 20 2011-07-04 03:48
-rw-r--r-- 1 root root 20 2011-07-04 03:47
-rw-r--r-- 1 root root 20 2011-07-04 03:48
-rw-r--r-- 1 root root 20 2011-07-04 03:47
При этом опять, если в рунчую если запустить - все создается нормально.
+ В обоих случаях (ручной запуск из шел и по крону) создается один лишний бекап появляется без нормального названия: ".tar.gz" (т.е. в начале нет названия домена) и общий объем у него похож на объем всех архивов вместе взятых.
Re: Создание архивов по папкам
Добавлено: 2011-07-19 11:11:00
shlash
Зачем так сложно? Можно значительно проще. Работает уже два с половиной года.
Полный скрипт значительно больше: монтирует бэкапный каталог по nfs, дампит все mysql базы и виртуальные хосты.
Фрагмент с виртуальными хостами:
Код: Выделить всё
currdate=`date +%Y-%m-%d`
dumpbase=/mnt/backup
dumpdir=${dumpbase}/${currdate}
vhostpath=/usr/local/www/virtual
mkdir ${dumpdir}
cd ${vhostpath}
for site in `ls`
do
/usr/bin/tar -czf ${dumpdir}/${site}.tar.gz --exclude .ftpquota ${site}
done