[[Скрипт контроля backup файлов]]

Скрипт контроля backup файлов

Данный скрипт контролирует количество хранящихся файлов.
Скрипт ищет все файлы в директории подходящего формата, затем анализирует их количество. Если количество одноименных backup'ов превышает заданное число, то скрипт удаляет более старые версии файлов.

Например при ограничении в 2 экземпляра
backup-myserver-20090104.tar.bz2
backup-myserver-20090101.tar.bz2
backup-myserver-20090201.tar.bz2
backup-newserver-20090306.tar.bz2
backup-newserver-20090207.tar.bz2
backup-newserver-20090112.tar.bz2
backup-newserver-20090505.tar.bz2


будут удалены файлы
backup-myserver-20090101.tar.bz2
backup-newserver-20090207.tar.bz2
backup-newserver-20090112.tar.bz2


Скрипт лучше интегрировать в скрипт делающий backup'ы или можно запускать отдельно.

Обязательно

  • избегать в имени наличие символов !#$%^&*() что бы избежать непредсказуемого поведения
  • имена файлов должны иметь формат {имя}{дата}{расширение}

имя : любое имя
дата : в формате YYYYMMDD
расширение : любое

Примеры

  backup.myserver.20090101.tar.bz2
  backup-myserver-20090101.tar.bz2
  backup@myserver-20090101.tar.bz2
  myserver20090101-rar
  myserver20090101zip


Использование

Установите переменные
BACKUPDIR : директория где располагаются файлы
MAXNUMBER : Число хранимых экземпляров
DOTNAME= : Расширение, задается как регулярное выражение. Например точка записана как '\.'


Листинг

Запустить и проверить список файлов для удаления, если скрипт сработал правильно, то расскомментировать последние команды

#!/bin/bash
# Контроль устаревших backup'ов
 
# !!!Директорию слешами не закрывать!!!
BACKUPDIR=/home/backup/ubuntu
# Максимально число хранимых архивов
MAXNUMBER=5
# Расширение  (запись регулярным выражением)
DOTNAME="\.tar\.bz2"
 
# Получение полного списка имен
FILELIST=`ls $BACKUPDIR | sed -e '/[0-9]\{8\}'$DOTNAME'$/!d'`
# Получение оригинальных имен
FILENAMES=`echo "$FILELIST" | sed -e 's/\(^.*\)\([0-9]\{8\}'$DOTNAME'$\).*/\1/g' | sort -u`
 
for CURRENT in $FILENAMES; do
   # Получение списка дат для текущего архива на удаление
   TEMP1=`echo "$FILELIST" | sed -e '/\(^'$CURRENT'\)\([0-9]\{8\}\)\('$DOTNAME'$\)/!d' -e 's/\(^'$CURRENT'\)\([0-9]\{8\}\)\('$DOTNAME'$\)/\2/g' | sort -rn`
   TEMP1=`echo "$TEMP1" | sed -e '1,'$MAXNUMBER'd'`
   #Склеивание
   for TEMP2 in $TEMP1; do
      DELETELIST=`echo $CURRENT$TEMP2${DOTNAME//\\\/} && echo "$DELETELIST"`
   done
   DELETELIST=`echo "$DELETELIST" | sed -e '/^$/d'`
done
 
echo "========== Файлы будут удалены =========="
echo "$DELETELIST"
 
# После проверки расскомментировать эти строки
#for CURRENT in $DELETELIST; do
#echo $BACKUPDIR/$CURRENT
#rm $BACKUPDIR/$CURRENT
#done
 
exit 0


Реализация в виде функции

####### Контроль количества файлов ##############
# ВНИМАНИЕ ! Используемые имена переменных: FILELIST FILENAMES TEMP1 TEMP2 DELETELIST CURRENT
function backup_control () {
DELETELIST=""
if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then
  echo "backup_control Значения не заданы"
  return
fi
if [ ! -d $1 ]; then
  echo "backup_control Директория не верна"
  return
 fi
 
FILELIST=`ls $1 | sed -e '/[0-9]\{8\}'$3'$/!d'`
FILENAMES=`echo "$FILELIST" | sed -e 's/\(^.*\)\([0-9]\{8\}'$3'$\).*/\1/g' | sort -u`
for CURRENT in $FILENAMES; do
   # Получение списка дат для текущего архива на удаление
   TEMP1=`echo "$FILELIST" | sed -e '/\(^'$CURRENT'\)\([0-9]\{8\}\)\('$3'$\)/!d' -e 's/\(^'$CURRENT'\)\([0-9]\{8\}\)\('$3'$\)/\2/g' | sort -rn`
   TEMP1=`echo "$TEMP1" | sed -e '1,'$2'd'`
   #Склеивание
   for TEMP2 in $TEMP1; do
      DELETELIST=`echo $CURRENT$TEMP2${3//\\\/} && echo "$DELETELIST"`
   done
   DELETELIST=`echo "$DELETELIST" | sed -e '/^$/d'`
done
if [ -n "$DELETELIST" ]; then
echo "========== Файлы будут удалены =========="
echo "$DELETELIST"
 fi
for CURRENT in $DELETELIST; do
rm $1/$CURRENT
done
}
 
# Выполнение
# backup_control <BACKUPDIR> <MAXNUMBER> <DOTNAME>
backup_control "/home/backup/system" 6 "\.tar\.gz"
backup_control "/home/backup/system" 14 "\.sql\.bz2"

Обсуждение

Александр, 2012/10/19 15:42

Спасибо большое. то что искал, полностью рабочий)СПСССССС

Ваш комментарий. Вики-синтаксис разрешён:
107 -13 = ?
 
practice/bash/script1.txt · Последние изменения: 2012/06/03 21:52 (внешнее изменение)
Gentoo Linux Driven by DokuWiki