Como escrever um script de backup Bash mais seguro com tar
Crie um script de backup Bash que valide a origem, evite sobrescritas silenciosas, remova arquivos parciais e confira o arquivo tar.
Iniciar lição interativaUm script de backup Bash útil deve rejeitar uma origem inexistente, manter o destino fora dessa origem, evitar a sobrescrita silenciosa de um arquivo anterior, remover a saída parcial após uma falha e inspecionar o arquivo antes de informar sucesso. O exemplo abaixo cria um arquivo tar compactado com essas proteções. É um script de aprendizagem, não um sistema de backup completo. A lição de scripts Bash permite praticar como essas partes se encaixam.
Comece com caminhos explícitos para origem e destino
Salve o conteúdo abaixo como backup.sh:
#!/usr/bin/env bash
set -euo pipefail
source_dir="${1:-$HOME/data}"
backup_dir="${2:-$HOME/backups}"
if [[ ! -d "$source_dir" ]]; then
printf 'Source directory not found: %s\n' "$source_dir" >&2
exit 1
fi
mkdir -p "$backup_dir"
source_parent=$(dirname "$source_dir")
source_name=$(basename "$source_dir")
timestamp=$(date '+%Y%m%d-%H%M%S')
archive="$backup_dir/${source_name}-${timestamp}.tar.gz"
partial="$archive.partial"
if [[ -e "$archive" || -e "$partial" ]]; then
printf 'Backup destination already exists: %s\n' "$archive" >&2
exit 1
fi
trap 'rm -f "$partial"' EXIT
tar -czf "$partial" -C "$source_parent" "$source_name"
tar -tzf "$partial" >/dev/null
mv "$partial" "$archive"
trap - EXIT
printf 'Backup created: %s\n' "$archive"
O primeiro argumento seleciona o diretório de origem, e o segundo define onde os arquivos serão armazenados. Sem argumentos, o script usa $HOME/data e $HOME/backups. Mantenha o diretório de backup fora do diretório de origem para que o script não tente arquivar a própria saída.
Entenda as verificações de segurança
set -euo pipefail faz essa sequência simples parar diante de uma falha de comando não tratada, de uma variável não definida ou de um comando com falha dentro de um pipeline. É uma proteção, não um substituto para o tratamento explícito dos casos de falha esperados.
O teste de diretório interrompe a execução antes de tar quando a origem não existe. O carimbo de data e hora evita que execuções normais reutilizem um nome fixo, enquanto a verificação explícita de existência rejeita uma colisão acidental no mesmo segundo.
Primeiro, o script grava em um caminho .partial. A armadilha EXIT remove esse arquivo parcial se tar, a inspeção do arquivo ou outro comando falhar. Somente um arquivo que pode ser lido com sucesso é movido para o nome final; depois disso, a armadilha é desativada.
Por que tar usa -C
Este comando cria um arquivo compactado com gzip:
tar -czf "$partial" -C "$source_parent" "$source_name"
As opções significam criar (c), compactar com gzip (z) e gravar no arquivo indicado em seguida (f). -C muda o diretório durante a operação, permitindo armazenar o nome e o conteúdo do diretório de origem em vez de um caminho absoluto.
Listar o conteúdo verifica se tar consegue ler a estrutura do arquivo:
tar -tzf "$archive"
Essa é uma verificação útil, mas não comprova que todos os arquivos estão atuais nem que uma restauração atenderá às suas necessidades.
Execute e teste o script
Confira a sintaxe antes da primeira execução:
bash -n backup.sh
bash backup.sh "$HOME/data" "$HOME/backups"
Depois, faça um teste de restauração em um diretório temporário:
restore_dir=$(mktemp -d)
tar -xzf "$HOME/backups/data-YYYYMMDD-HHMMSS.tar.gz" -C "$restore_dir"
find "$restore_dir" -type f
Substitua o nome de exemplo pelo arquivo que o script informou. Inspecione alguns arquivos restaurados representativos e remova o diretório temporário quando não precisar mais dele.
O que um backup real ainda precisa
Um arquivo local pode ser perdido junto com o mesmo disco que guarda a origem. Um plano de backup para produção também precisa de um destino independente, regras de retenção e exclusão, monitoramento, credenciais protegidas, espaço livre suficiente e testes regulares de restauração. Decida também como lidar com alterações simultâneas nos arquivos; tar sozinho não cria um backup consistente de um banco de dados em uso.
Leia como executar seu primeiro script Bash se o shebang ou as permissões ainda forem desconhecidos e use a lição de tar para praticar a criação de arquivos. O GNU documenta criação, compactação, sobrescrita e verificação no manual do tar.
Referências
Estes links de documentação trazem detalhes confiáveis sobre os comandos usados neste artigo.
A seguir
Pratique a movimentação dos diretórios filho e pai até que as mudanças de caminho pareçam automáticas.