Создание архивов по папкам

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
.scu
сержант
Сообщения: 198
Зарегистрирован: 2008-05-26 11:25:08
Контактная информация:

Создание архивов по папкам

Непрочитанное сообщение .scu » 2011-06-19 16:25:07

В shell программировании не очень сильна, поэтому нужна ваша помощь :)

собственно вопрос: как сделать архивы отдельно по папкам?
т.е. полный алгоритм:
1) в заданной директории получаем список папок
2) архивируем каждую папку в отдельный архив.

Пример:
базовая директория = /home/domains
директория для бекапов: /home/backups
в директории папки:
site1
site2
site3
на выходе получаем в папке /home/backups архивы:
site1.tar
site2.tar
site3.tar

заранее благодарна за помощь ^_^

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Создание архивов по папкам

Непрочитанное сообщение FreeBSP » 2011-06-19 17:20:04

самое базовое

Код: Выделить всё

#!/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 у тара
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

.scu
сержант
Сообщения: 198
Зарегистрирован: 2008-05-26 11:25:08
Контактная информация:

Re: Создание архивов по папкам

Непрочитанное сообщение .scu » 2011-06-19 18:07:39

Большое спасибо за помощь!

.scu
сержант
Сообщения: 198
Зарегистрирован: 2008-05-26 11:25:08
Контактная информация:

Re: Создание архивов по папкам

Непрочитанное сообщение .scu » 2011-06-20 7:29:33

что-то видимо не так с синтаксисом, приведенный пример не выводит директорию :( (т.е. переменная директории остается пустой)

если исправить на:

Код: Выделить всё

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

.scu
сержант
Сообщения: 198
Зарегистрирован: 2008-05-26 11:25:08
Контактная информация:

Re: Создание архивов по папкам

Непрочитанное сообщение .scu » 2011-06-20 8:02:56

я так понимаю, что проблема в том, что while выполняется уже после того, как отработал awk, поэтому переменная dir пустая. Как сделать верно?

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Создание архивов по папкам

Непрочитанное сообщение FreeBSP » 2011-06-20 11:07:34

на линухе все немного по другому =)
в частности 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
}
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

.scu
сержант
Сообщения: 198
Зарегистрирован: 2008-05-26 11:25:08
Контактная информация:

Re: Создание архивов по папкам

Непрочитанное сообщение .scu » 2011-06-21 1:43:21

удалось решить проблему, оказалась в синтаксисе :)

рабочий код, вдруг кому пригодиться:

Код: Выделить всё

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' ?

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Создание архивов по папкам

Непрочитанное сообщение FreeBSP » 2011-06-21 2:01:56

а в чем конкретно ошибка была?
и что в том большом архиве?
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

FiL
ст. лейтенант
Сообщения: 1374
Зарегистрирован: 2010-02-05 0:21:40

Re: Создание архивов по папкам

Непрочитанное сообщение FiL » 2011-06-21 4:38:38

вообще мне как-то этот ls -l |grep -e '^d' |awk не нравятся в данном случае.
В первую очередь тем, что print $8 не выведет полное имя каталога, если оно с пробелами.
Ну и как-то оно неаккуратно. Я-бы все-таки советовал find . -type d -maxdepth 1

.scu
сержант
Сообщения: 198
Зарегистрирован: 2008-05-26 11:25:08
Контактная информация:

Re: Создание архивов по папкам

Непрочитанное сообщение .scu » 2011-06-30 23:19:49

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
)
раньше с подобной проблемой не сталкивалась О_о

.scu
сержант
Сообщения: 198
Зарегистрирован: 2008-05-26 11:25:08
Контактная информация:

Re: Создание архивов по папкам

Непрочитанное сообщение .scu » 2011-07-01 10:48:53

кто-нибудь может помочь решить вопрос? почему при вызове срипта вручную - файлы с архивами корректно создаются, а при запуске из крона - нет :(

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Создание архивов по папкам

Непрочитанное сообщение FreeBSP » 2011-07-02 20:48:18

Код: Выделить всё

# бекап по доменам
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
)
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

.scu
сержант
Сообщения: 198
Зарегистрирован: 2008-05-26 11:25:08
Контактная информация:

Re: Создание архивов по папкам

Непрочитанное сообщение .scu » 2011-07-03 18:44:07

попробуй ваш вариант, спасибо!

.scu
сержант
Сообщения: 198
Зарегистрирован: 2008-05-26 11:25:08
Контактная информация:

Re: Создание архивов по папкам

Непрочитанное сообщение .scu » 2011-07-03 21:05:38

Ваш вариант не работает :(, видимо потому, то вместо папки выводит путь до папки

.scu
сержант
Сообщения: 198
Зарегистрирован: 2008-05-26 11:25:08
Контактная информация:

Re: Создание архивов по папкам

Непрочитанное сообщение .scu » 2011-07-05 11:28:15

Переделала Ваш пример на:

Код: Выделить всё

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" (т.е. в начале нет названия домена) и общий объем у него похож на объем всех архивов вместе взятых.

shlash
мл. сержант
Сообщения: 82
Зарегистрирован: 2007-10-21 13:34:58
Откуда: С.-Петербург
Контактная информация:

Re: Создание архивов по папкам

Непрочитанное сообщение shlash » 2011-07-19 11:11:00

Зачем так сложно? Можно значительно проще. Работает уже два с половиной года.
Полный скрипт значительно больше: монтирует бэкапный каталог по 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