@olegZZ552
Тыжпрограммист в маленьком офисе

Как правильно написать bash-скрипт для копирования файлов?

Есть папка с большим количеством документов и структурой: год, месяц,день,час. Хочу организовать резервное копирование с архивированием данных в таком же стиле. Например:
Отчеты/2017/01/01/01/00 и получить на выходе папку с архивами в таком же порядке 2017/01/01/01/00.tar.gz . Так, как места на рабочем ПК мало, а в каждой папке за час генерируется до 10 ГБ отчетов, то хотелось бы чтобы после создания архива скопированная папка удалялась. Прошу не судить строго-я начинающий эникей. Добрым людям отвечу добром на Яндекс-кошелек.
  • Вопрос задан
  • 944 просмотра
Пригласить эксперта
Ответы на вопрос 2
@galaxy
Ну что-то типа:
cd Отчеты
for d in 2017/01/01/01/*; do mkdir -p /path/to/backup/`dirname $d`; tar -czf /path/to/backup/$d.tgz $d; rm -rf $d; done


Чтобы не менять месяц/день, можно и так: for d in 2017/*/*/*/*;
Ответ написан
привожу вам реальные примеры скриптов, тут есть все ответы на ваши вопросы.
#!/bin/sh
#скрипт бэкапа баз данных
###########################
#Создаем папку для архивов.  -p не ругается когда папка уже есь test проверяет есть ли папка  для чистых логов
test ! -d /var/backup/mysql/`date +%Y` && { mkdir -p /var/backup/mysql/`date +%Y` ; }
test ! -d /var/backup/mysql/last && { mkdir -p /var/backup/mysql/last ; }

#прячем от умных, и так не зайдут но всеже.
chmod 600 /var/backup/mysql
chmod 600 /var/backup/mysql/last

# делаем сам дапм файлов sql, свежинькие файлы лежат всегда в ней, очень удобно не нужно заходить в архивы и искать там вчерашние базы, и логируется.
for i in `mysql -uroot -p342342r2 -e'show databases;' | grep -v information_schema | grep -v Database`; do mysqldump -uroot -p342342r2 $i > /var/backup/mysql/last/$i.sql;done >> /dev/null 2>> /var/log/sqlbackup.log
# Архивируем дамп, ну и логируем разумеется
cd /var/backup/mysql/
tar -czvf /var/backup/mysql/`date +%Y`/sqldump-`date +%Y-%m-%u`.tar.gz ./last >> /dev/null > /var/log/sqlbackup.log
#(echo "Subject: Бэкап mysql   завершен"; cat /var/log/sqlbackup.log;) | /usr/sbin/sendmail  info@example.ru
##################  Конец скрипта

а вот с ротированием
#  БЭКАП /etca
test ! -d /var/backup/etc/ && { mkdir -p /var/backup/etc/ ; }
DATE=`date +%F`;
BACKUPPATH="/var/backup/etc";
find $BACKUPPATH/ -mtime +60 | xargs rm -f; #удаляет предыдущие бэкапы старше 60 дней.
tar -czvf "$BACKUPPATH/etc.$DATE.tar.gz" /etc/ > /dev/null 2> /dev/null;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы