Страница 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