A simple script utilizing rsync for both full and differential backups, and auto folder naming.
Go to file
2022-07-20 02:15:47 -07:00
.gitignore Ignore pycharm 2019-08-04 17:51:07 -07:00
LICENSE Create LICENSE 2018-09-02 03:24:16 -07:00
mikes-backup Added some options to Rsync for: Verbose, One File System, Skip Links 2020-04-04 07:06:01 -07:00
README.md Farewell update 2022-07-20 02:15:47 -07:00

Mikes Backup

*** Currently Archived; Read Section Below ***

Easily run both full and differential backups with rsync, to a local folder or an SSH server.

This script is really just a wrapper around rsync's beautiful functionality. It presents a simplified interface for one very narrow use case: Simplifying the process of running daily backups:

  • You may easily force a full of differential backup type with a simple command line argument (see below)
  • Otherwise, it will automatically choose a full or differential backup type, based on whether it detects an existing full backup folder at the backup destination
  • For differential backups, it automatically generates a folder based on today's date and time, making it easier to store many differentials without the need to manually fuss with anything

Archive Status

I've decided to discontinue development of this project because restic is so much more robust, useful, and cool. Mike's Backup still works as of this writing (2022-07-20), but I've moved all my personal backups over to restic.


  • rsync
  • python3
  • Backup destination accessible as a local directory OR a remote SSH server

Command Line Arguments

  • --full Forces the script to run a full backup
  • --differential Forces the script to run a differential backup
  • --diff Same as ---differential
  • --no-incremental Always force differentials to link back to the full backup, and not the most recent differential
  • --log-dir <directory> Let's you set the log output directory
  • --log-name Let's you set a name to the log file
  • --source-dir <directory> Specifies the local source directory
  • --include <directory> Specifies another local source directory to include in the backup
  • --source-mountpoint <directory> Make sure a local mountpoint is mounted before continuing
  • --destination-dir <directory> Specifies the backup destination directory
  • --exclude <dir> Specifies a source directory to exclude (can be passed multiple times)
  • --remote-host <hostname> Specifies the remote host, if your backup destination is an SSH server
  • --remote-user <username> Specifies the remote username to use, if your backup destination is an SSH server
  • --ssh-key <path to key> Specifies the local SSH key to use for authentication, if your backup destination is an SSH server

Note that --remote-host, --remote-user, and --ssh-key are only needed if your backup destination is a remote SSH server. You may omit all three if the destination is a locally mounted folder.


For daily use, you'll probably want to create a small bash script that calls this script with the parameters you want, and then call that with cron daily (or whatever your preference is)


# Backup to an SSH server
/path/to/mikes-backup \
  --log-dir "/my/log/dir/my-awesome-host-logs/" \
  --source-dir "/home/or/whatever/" \
  --destination-dir "/path/to/backup/destination/" \
  --remote-host "my-awesome-host.home" \
  --remote-user "my-remote-user" \
  --ssh-key "/home/me/.ssh/id_rsa" \
  --exclude "/my/dumb/downloads" \
  --exclude "/my/even/dumber/downloads"

# Backup to a local folder
/path/to/mikes-backup \
  --log-dir "/my/log/dir/local-backups/" \
  --source-dir "/home/or/whatever/" \
  --destination-dir "/local/path/to/backup/destination/" \
  --exclude "/my/dumb/downloads" \
  --exclude "/my/even/dumber/downloads"


I realize these docs are sparse at best, so please send in questions if you have any, and I will try to update this file or create a Wiki if need be