Скрипт контроля 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"
Обсуждение
Спасибо большое. то что искал, полностью рабочий)СПСССССС