weekly-backup - backup agendado
Publicado por Pedro Fernandes (última atualização em 12/01/2022)
[ Hits: 1.369 ]
Homepage: https://github.com/PedroF37
Download 1640474098.weekly-backup (versão 2)
Script usa a ferramenta tar com a opção '-g', ou '--listed-incremental', para fazer 4 backups por mês os quais são:
1 backup completo uma vez no mês.
3 backups diferenciais nas restantes três semana (1 por semana!).
A opção -g do tar, cria um arquivo de snapshot com os metadados dos itens que estão no arquivamento.
Se usarmos sempre o mesmo arquivo como referência, esse arquivo vai sendo atualizado e cria backups incrementais
ao invés de diferenciais.
Mas, se em cada novo backup, copiarmos sempre o arquivo de snapshot original, e usarmos sempre a cópia do original,
então, as diferenças que vão constar, são as diferenças entre 'hoje' e o dia do primeiro backup (o backup completo).
É o que o script faz.
Antes de usar o script, por favor leia o cabeçalho todo do script.
Versão 2 - Enviado por Pedro Fernandes em 25/12/2021
Changelog: Script corrigido e escrito quase do zero, porque a aritmética com as datas (que no script original era o meio de saber se era ou não hora de fazer um backup completo), estava totalmente errada.
O script da forma como estava nunca fazia backup diferencial, fazia sempre backup completo.
Agora script vê se é ou não hora de fazer backup completo, simplesmente contando quantos "DiffBackups..." é que existem na pasta e se existirem 3 ou mais, então o script cria novamente o backup completo e começa do zero.
Download 1640474098.weekly-backup
#!/bin/bash # ########################################################### # # SCRIPT weekly-backup # AUTOR Pedro Fernandes # EMAIL pedrobfernandes37@gmail.com # DATA 17-05-2021 # # --------------------------------------------------------- # # DESCRIÇÃO: # # Script para fazer backups semanais, usando a ferramenta # tar. Scripts serão 1 backup completo (nível 0) por mês, # e os restantes serão backups diferenciais (nível 1) por # semana. # # --------------------------------------------------------- # # FUNCIONAMENTO: # # O script usa a opção '-g' do tar, para criar arquivo de # snapshot, com os metadados dos itens incluidos no backup. # Se usarmos sempre esse mesmo arquivo como referência o # tar cria backups incrementais, porque a cada backup esse # arquivo é atualizado. Mas, se em cada novo backup, nós # fizermos uma cópia do arquivo original, e usarmos sempre # uma cópia, então o backup vai conter as diferenças entre # o dia atual e o dia do primeiro backup (o backup completo) # É isso que o script faz. # # Atenção que script manda muito output, então se for # por em crons e coisas dessas, não se esqueça de redirecionar # as saídas e erros ok!! # # --------------------------------------------------------- # # PROCEDIMENTO: # # O script usa três variáveis, cada uma que retorna uma # data: # # -DateBackup -> esta tem a data de 'hoje' # -NextWeek -> esta tem a data da próxima semana # -LastMonth -> esta tem a data do próximo mês # # ************************************************** # # Com elas (variáveis) o script faz o seguinte: # # 1. Verifica se existe algum arquivo 'FullBackup*.snar' # (.snar é a extensão do arquivo de snapshot). # # 2. Se não houver, o script cria um backup completo (Full) # e o arquivo de snapshot correspondente. O arquivo chama-se: # 'FullBackup-${DateBackup}.snar' # # 3. Se houver, o script usa a data no nome do arquivo, e # compara com a data retornada pela variável LastMonth, # que tem a data do mês passado, e vê se passou um mês # ou mais. # # 4. Se tiver passado, o script cria uma pasta # onde coloca todos os arquivos .snar e .t[gbx]z, e # então começa de novo. Ou seja, cria o backup completo # e seu arquivo de snapshot correspondente. # # 5. Se não tiver passado, então o script faz uma cópia # do arquivo de snapshot original e usa essa cópia para # fazer o backup diferencial. A cópia chama-se: # 'DiffBackup-${DateBackup}-to-${NextWeek}.snar' # # --------------------------------------------------------- # # NOTAS: # # O script usa três variáveis que é para você configurar: # # 1. Compact - nesta variável, você diz se quer usar # gzip, bzip, ou xz. São estes mesmos nomes, # ou seja, você não coloca gz em vez de gzip # nem bzip2 em vez de bzip. O script usa o # case para ver qual está configurado mas, não # fiz 'or' nenhum do tipo 'gzip | gz)', então se # não tiver estes nomes vai dar erro. # # 2. BackupDestiny - nesta você especifica o diretório # para os backups. (Caminho Absoluto) # Você tem que criar o diretório ok? # O script não cria para você!! # Exemplo: # # BackupDestiny=/archive/pedro # # 3. ConfigFile - nesta você coloca o nome do arquivo com # os itens para backup. O arquivo você põe # o caminho absoluto e os itens para backup # a mesma coisa. Exemplo: # # ConfigFile=/home/pedro/BackupList.txt # # Formato do arquivo: # # /home/pedro/Documentos # /home/pedro/MEGAsync # etc etc.. # ########################################################### # ##### PARÂMETROS # ### Você configura aqui # Compact= ConfigFile= BackupDestiny= # ### Daqui em diante não precisa ### mexer mais ok? # DateBackup=$(date +%d-%m-%Y) NextWeek=$(date -d "next week" +%d-%m-%Y) LastMonth=$(date -d "last month" +%d-%m-%Y) FullSnapshot=FullBackup-${DateBackup}.snar DiffSnapshot=DiffBackup-${DateBackup}-to-${NextWeek}.snar # ########################################################### # ##### FUNÇÃO PARA MENSAGENS DE ERRO # function ErrorExit { # echo echo "$@" >&2 echo Terminando script... >&2 exit 1 } # ########################################################### # ##### VERIFICAÇÕES # # Verificamos por existência de diretório, arquivo de # configuração, permissões, etc... # [ -z "$BackupDestiny" ] && { ErrorExit 'Não especificou pasta de destino dos backups.' } # [ ! -d "$BackupDestiny" ] && { ErrorExit "Pasta $BackupDestiny não existe." } # [ ! -r "$BackupDestiny" ] || [ ! -w "$BackupDestiny" ] || [ ! -x "$BackupDestiny" ] && { ErrorExit "Precisa de ter permissão para a pasta $BackupDestiny" } # [ -z "$ConfigFile" ] && { ErrorExit 'Não especificou arquivo com lista de itens para fazer backup.' } # [ ! -f "$ConfigFile" ] && { ErrorExit "$ConfigFile não existe ou não e arquivo regular." } # [ ! -r "$ConfigFile" ] || [ ! -s "$ConfigFile" ] && { ErrorExit "Não tem permissão de leitura para $ConfigFile ou arquivo está vazio." } # if [ -z "$Compact" ] then ErrorExit "Não especificou o método de compactação" else case $Compact in # gzip) Comp=-czf OutFullArchive=FullBackup-${DateBackup}.tgz OutDiffArchive=DiffBackup-${DateBackup}.tgz ;; bzip) Comp=-cjf OutFullArchive=FullBackup-${DateBackup}.tbz OutDiffArchive=DiffBackup-${DateBackup}.tbz ;; xz) Comp=-cJf OutFullArchive=FullBackup-${DateBackup}.txz OutDiffArchive=DiffBackup-${DateBackup}.txz ;; *) ErrorExit "Input Inválido" # esac fi # ########################################################### # ##### LISTA DE ITENS PARA BACKUP # echo Compondo lista de itens para backup. # # Lê o arquivo de configuração. Entada padrão é # ConfigFile. Line, vai guardando as linhas lidas # até ao momento, para falar em que linha está # o item inexistente, ou, o item ao qual usuário # não tem permissão. # exec 3<&0 exec 0<$ConfigFile Line=1 read Item # while [ $? -eq 0 ] do if [ -f "$Item" ] || [ -d "$Item" ] then # # Vemos se tem permissão. Ou é dono # ou é root. Se tiver permissão ok, # se não, saímos do script. # if [ -O "$Item" ] || [ $UID -eq 0 ] then : else echo echo '############################################################' echo echo Você não tem permissão para Item ${Item##*/} >&2 echo especificado na linha $Line de ${ConfigFile##*/} >&2 echo Terminando script... >&2 echo echo '###########################################################' exit 1 fi # # Juntamos itens em lista. # BackupList="$BackupList $Item" else # # Se não existir o Item, simplesmente # avisamos sem sair com erro. Usuário # pode ter deletado arquivo/diretório e # simplesmente esqueceu de atualizar # ConfigFile. # echo echo '##############################################################' echo echo O Item ${Item##*/} não existe. echo Está especificado na linha $Line de ${ConfigFile##*/}. echo Não iremos incluir no backup. Prosseguindo... echo echo '##############################################################' fi # Line=$(($Line + 1)) read Item done exec 0<&3 # echo echo Composição de lista concluída. echo # ########################################################### # ##### BACKUP # # Primeiro tentamos entrar em diretório # cd $BackupDestiny || { ErrorExit "Não conseguimos entrar em $BackupDestiny" } # # OK? Vamos ver se tem arquivo de snapshot. Se não # tiver, criamos um Full. Se tiver, temos que descobrir # se já passou um mês ou não. Se tiver passado um mês, # criamos pasta para armazenar o backup full e os # diferenciais e então começamos tudo de novo. # Criamos o backup Full e o snapshot Full, na semana # seguinte cria os diferenciais etc etc. # Match=$(ls FullBackup*.snar 2> /dev/null) # if [ -z "$Match" ] then echo echo Iniciando backup... tar -g $FullSnapshot $Comp $OutFullArchive $BackupList 2> /dev/null else # Expired=$(echo "$LastMonth" | sed 's/-//g') OutOfDate=$(echo "$Match" | cut -d '-' -f 2-4 | \ cut -d '.' -f 1 | sed 's/-//g') # if [ "$Expired" -ge "$OutOfDate" ] then mkdir Backup-$LastMonth mv *.snar *.t[gbx]z Backup-$LastMonth echo echo Iniciando backup... tar -g $FullSnapshot $Comp $OutFullArchive $BackupList 2> /dev/null else cp "$FullSnapshot" "$DiffSnapshot" echo echo Iniciando backup... tar -g $DiffSnapshot $Comp $OutDiffArchive $BackupList 2> /dev/null fi fi # echo Backup concluido.... echo Terminando script... exit 0 # ###########################################################
Backup, compactação, verificação e transferência de arquivos
MySQL - Script para backup automatizado
rsyncdev-pt_BR.sh - Um baixador automático de ISOs de Sabayon Linux
Backup de banco de dados MySQL
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Não to conseguindo resolver este problemas ao instalar o playonelinux (1)
Excluir banco de dados no xampp (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta