#!/bin/sh # A backup a day keeps the doctor away. usage() { echo "Usage: $0 [-nv] [[[user@]host]:dir] Incremental backup using rsync(1). If run as root, a full system backup is performed. Otherwise, the user's home directory is backed. Options: -n dry-run -v verbose Files: - $HOME/.backupignore exclude files from user backup (non root) - /etc/backupignore exclude files from system backup (root) Environment: - BACKUP backup directory" } while getopts :nv opt; do case $opt in (n|v) optv="$opt$optv" ;; (*) usage; exit 1 ;; esac done shift $((OPTIND - 1)) BACKUP=${1:-$BACKUP} [ "$BACKUP" ] || { usage; exit 1; } [ "$USER" = root ] && ignore=/etc/backupignore volumes='/ /boot' || ignore="$HOME/.backupignore" volumes="$HOME" [ -f "$ignore" ] && ignore="--exclude-from=$ignore" || ignore= now=$(date +%F) opt_link='' past=$(rsync --list-only "$BACKUP/" 2>/dev/null | awk '{print $NF}' | sort -r) for f in $past do case $f in ([0-9][0-9][0-9][0-9]-*) ;; (*) continue ;; esac [ "$f" = "$now" ] && continue opt_link="--link-dest=../$f" break done echo "# Backup $volumes to $BACKUP/$now" exec rsync -HSXxa$optv $ignore $opt_link $volumes "$BACKUP/$now"