Скрипт или утилита для удаления старых резервных копий - PullRequest
0 голосов
/ 14 августа 2010

Я создаю стратегию резервного копирования для сервера sharepoint, который я настраиваю.

Ежедневно выполняется резервное копирование.

В долгосрочной перспективе я бы хотел сохранить:

* Daily backups for the last week.
* Weekly backups for the last month.
* Monthly backups for the last year.
* Yearly backups.

Если бы я писал в bash / cygwin, мне было бы довольно легко написать скрипт для очистки резервных копий, которые не требуются этой стратегией. Однако я бы предпочел не устанавливать Cygwin, я бы предпочел сделать это с помощью собственных сценариев DOS или другого специализированного инструмента.

Мои навыки написания сценариев в DOS очень примитивны, поэтому мне было интересно, есть ли у кого-нибудь еще подобный скрипт / утилита, которую я мог бы использовать.

Ура!

Ответы [ 2 ]

0 голосов
/ 28 сентября 2011

В итоге я написал скрипт bash для этого. run-backup-maintenance.sh

Пример использования: run-backup-maintenance.sh d7w4m12y10 / cygdrive / d / backup ". *. Tar"

ПРИМЕЧАНИЕ. Все ежедневные резервные копии должны быть записаны в: / cygdrive / d / backup / daily

При запуске с параметром d7w4m12y10 этот сценарий гарантирует, что со временем:

/cygdrive/d/backup/daily    will contain daily backups for the last 7 days
/cygdrive/d/backup/weekly   will contain weekly backups for the last 4 weeks
/cygdrive/d/backup/monthly  will contain monthly backups for the last 12 months
/cygdrive/d/backup/yearly   will contain yearly backups for the last 10 years

Наслаждайтесь!

#!/bin/bash
die () {
    echo >&2 "$@"
    exit 1
}

[ "$#" -eq 3 ] || die "Usage run-backup.sh <options> <backupDir> <artefact>."$'\n'"3 arguments required, $# provided."$'\n'"Options should be given as d#w#m#y#, where # is a number denoting how long to keep the specified backup period."$'\n'"e.g. d7w4m12y10 says that backup will keep: 7 daily backups, 4 weekly backups, 12 monthly backups and 10 yearly backups."

#################################
#PROCESS PARAMETERS
backupDir=$2
artefactPattern=$3

regex="d\([0-9]*\)w\([0-9]*\)m\([0-9]*\)y\([0-9]*\)"
days=`echo $1 | sed "s/$regex/\1/g"`
weeks=`echo $1 | sed "s/$regex/\2/g"`
months=`echo $1 | sed "s/$regex/\3/g"`
years=`echo $1 | sed "s/$regex/\4/g"`

echo "Running backup in folder $backupDir against artefacts matching $artefactPattern keeping: $days days, $weeks weeks, $months months, $years years"

#################################
#YEARLY

if [ $years -ne 0 ]; then
    #Check that the yearly folder has a backup for the last 365 days
    fileListing=`find $backupDir/yearly -mtime -364 | grep "$artefactPattern"`
    if [ "$fileListing" == "" ]; then
        echo 'No files from last 365 days found, taking most recent daily backup...'
        cd $backupDir/daily/
        ls -t1 | grep "$artefactPattern" | head -n1 | xargs -t -I {} cp -r {} ../yearly/
        cd ../..
    else
        echo 'Yearly backup found, no copying required...'
    fi

    #Remove yearly backups older than x years
    find $backupDir/yearly -mtime +$(((years*365)-1)) | grep "$artefactPattern" | xargs rm -rf
fi

#################################
#MONTHLY

if [ $months -ne 0 ]; then
    #Check that the weekly folder has a backup for the last 30 days
    fileListing=`find $backupDir/monthly -mtime -29 | grep "$artefactPattern"`
    if [ "$fileListing" == "" ]; then
        echo 'No files from last 30 days found, taking most recent daily backup...'
        cd $backupDir/daily/
        ls -t1 | grep "$artefactPattern" | head -n1 | xargs -t -I {} cp -r {} ../monthly/
        cd ../..
    else
        echo 'Monthly backup found, no copying required...'
    fi

    #Remove monthly backups older than x months
    find $backupDir/monthly -mtime +$(((months*30)-1)) | grep "$artefactPattern" | xargs rm -rf
fi

#################################
#WEEKLY

if [ $weeks -ne 0 ]; then
    #Check that the weekly folder has a backup for the last 7 days
    fileListing=`find $backupDir/weekly -mtime -6 | grep "$artefactPattern"`
    if [ "$fileListing" == "" ]; then
        echo 'No files from last 7 days found, taking most recent daily backup...'
        cd $backupDir/daily/
        ls -t1 | grep "$artefactPattern" | head -n1 | xargs -t -I {} cp -r {} ../weekly/
        cd ../..
    else
        echo 'Weekly backup found, no copying required...'
    fi

    #Remove weekly backups older than X days
    find $backupDir/weekly -mtime +$(((weeks*7)-1)) | grep "$artefactPattern" | xargs rm -rf
fi

#################################
#DAILY

if [ $days -ne 0 ]; then
    #Remove daily backups older than X days
    find $backupDir/daily -mtime +$((days-1)) | grep "$artefactPattern" | xargs rm -rf
else
    find $backupDir/daily | grep "$artefactPattern" | xargs rm -rf
fi 
0 голосов
/ 14 августа 2010

Вы можете использовать PowerShell для выполнения довольно сложной процедуры резервного копирования.Или вы можете написать сценарий на Python или другом исполняемом языке сценариев.

PowerShell поначалу может быть сложным, но в основном это Batch Scripts on crack с доступом к .NET Runtime.


Примечание: PowerShell, я полагаю, доступен только на 2003, Vista, Windows 7 (я знаю, что он поставляется с ними, по крайней мере, он может работать с XP / 2000, но я не уверен).Python может быть установлен на все что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...