DEV Community

Sourav kumar
Sourav kumar

Posted on

Day-06/100 - Automating Backups with Rotation using ZIP method | Comparision with rsync method

Backups are essential for protecting data from accidental deletion, corruption, or hardware failures. However, managing backups efficiently requires automating both the backup creation process and the rotation (deletion of old backups). In this blog, we'll explore a simple Bash script that performs these tasks seamlessly.

Overview of the Backup Script

This Bash script automates the process of creating compressed backups of a specified directory and retains only the latest five backups. Older backups are automatically deleted to save storage space.

Features:

  1. Creates a zip backup of a specified directory.
  2. Uses a timestamp to uniquely name each backup.
  3. Retains only the latest five backups and removes older ones.
  4. Runs efficiently with minimal user intervention.

Script Breakdown

Here's the script:

#! /bin/bash

<< readme
This is a script for backup with 5-day rotation

Usage:
./backup_and_rotation.sh <path to your source> <path to backup folder>
readme

function display_usage {
    echo "Usage: ./backup_and_rotation.sh <path to your source> <path to backup folder>"
}

if [ $# -eq 0 ]; then
    display_usage
    exit 1
fi

source_dir=$1
timestamp=$(date '+%Y-%m-%d-%H-%M-%S')
backup_dir=$2

function create_backup() {
    zip -r "${backup_dir}/backup_${timestamp}.zip" "${source_dir}" > /dev/null

    if [ $? -eq 0 ]; then
        echo "Backup generated successfully for ${timestamp}"
    else
        echo "Backup failed!" >&2
    fi
}

function perform_rotation() {
    # Using glob instead of `ls` to avoid errors if no backups exist
    backups=("${backup_dir}"/backup_*.zip)
    backups=($(ls -t "${backups[@]}" 2>/dev/null))  # Sort backups by timestamp

    echo "Existing backups: ${backups[@]}"

    if [ "${#backups[@]}" -gt 5 ]; then
        echo "Performing rotation for 5 days"

        backups_to_remove=("${backups[@]:5}")  # Keep latest 5 backups
        echo "Removing backups: ${backups_to_remove[@]}"

        for backup in "${backups_to_remove[@]}"; do
            rm -f "${backup}"
        done
    fi
}

create_backup
perform_rotation
Enter fullscreen mode Exit fullscreen mode

Understanding the Script

1. Usage Instructions

The script includes a usage guide in a commented block to inform users how to execute it.

Usage: ./backup_and_rotation.sh <path to your source> <path to backup folder>
Enter fullscreen mode Exit fullscreen mode

This ensures that users provide the required arguments: the source directory and the backup folder.

2. Checking for User Input

Before proceeding, the script verifies that the required arguments are provided. If not, it displays a usage message and exits.

if [ $# -eq 0 ]; then
    display_usage
    exit 1
fi
Enter fullscreen mode Exit fullscreen mode

3. Backup Creation

The create_backup function compresses the specified directory into a .zip file, using a timestamp in the filename for uniqueness.

zip -r "${backup_dir}/backup_${timestamp}.zip" "${source_dir}" > /dev/null
Enter fullscreen mode Exit fullscreen mode

This ensures backups do not overwrite each other and makes it easier to track backup dates.

4. Backup Rotation

The script retains only the latest five backups. It sorts the existing backups by timestamp and removes older ones.

if [ "${#backups[@]}" -gt 5 ]; then
    backups_to_remove=("${backups[@]:5}")
    for backup in "${backups_to_remove[@]}"; do
        rm -f "${backup}"
    done
fi
Enter fullscreen mode Exit fullscreen mode

This ensures that old backups do not consume unnecessary storage space.

Running the Script

To execute the script, use:

chmod +x backup_and_rotation.sh
./backup_and_rotation.sh /path/to/source /path/to/backup
Enter fullscreen mode Exit fullscreen mode

For example:


./backup_and_rotation.sh /home/user/Documents /home/user/Backups
Enter fullscreen mode Exit fullscreen mode

Comparision

Image description

When to Use Zip-based Backup
Best for: Situations where you need complete, standalone backups that can be easily transferred, archived, or restored as a whole.

✅ Use Cases:

Periodic Full Backups – If you need a full copy of the data every time (e.g., weekly full backups).

Cloud Storage or Remote Archival– When backing up data to cloud storage (Google Drive, S3, etc.) where a single compressed file is easier to manage.

Disaster Recovery– If you need to store long-term snapshots of your system that can be restored independently.

File Versioning and Portability – When you need to download or send backups via email, FTP, or portable storage.

Backup Before System Updates – Creating a complete archive before running major software updates or upgrades.

Downside: Requires more storage space and can be slower due to compression overhead.


When to Use Rsync-based Backup
Best for: Situations where efficiency, speed, and incremental backups are needed.

✅ Use Cases:

Daily or Frequent Backups – Since rsync only copies changed files, it's perfect for daily or hourly backups.

Server or Web App Backups – For Linux servers, web applications, and databases, where only the latest changes matter.

Large File Systems – If you're backing up large directories, rsync saves time and disk space.

Network or Remote Backups – When syncing files between machines (e.g., from a local machine to a remote server).

Local System Synchronization – If you need to keep two directories synchronized without unnecessary duplication.

Downside: Does not create a single compressed file; you need to manually zip it later if needed.

Image description

Top comments (0)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.