#!/bin/bash

# Skrypt backup tworzący przyrostowe lub pełne kopie zapasowe
# plików w katalogu domowym użytkownika. Domyślnie tworzony plik wynikowy
# jest kompresowany i zapisywany w katalogu /tmp pod nazwą zawierającą
# oznaczenie czasu. Można również określić miejsce tworzenia kopii
# (inny dysk, zewnętrzne urządzenie lub inne dostępne miejsce).

compress="bzip2"    # Zmień na inny ulubiony program kompresujący.
output="/tmp/backup.$(date +%d%m%y).bz2"
tsfile="$HOME/.backup.timestamp"
btype="kopia przyrostowa"  # Domyślnie tworzona jest kopia przyrostowa.
noinc=0                    # Tu zmieniane jest oznaczenie czasu kopii.

usageQuit()
{
  cat << "EOF" >&2
Użycie: $0 [-o miejsce_docelowe] [-i|-f] [-n]
  -o umożliwia wybranie innego pliku/urządzenia docelowego
  -i powoduje utworzenie kopii przyrostowej, -f pełnej, a -n zapobiega
  zmianie oznaczenia czasu pliku po wykonaniu kopii przyrostowej.
EOF
  exit 1
}

########## Początek głównej części skryptu ###########

while getopts "o:ifn" opt; do
  case "$opt" in
    o ) output="$OPTARG";          ;; # getopts automatycznie zarządza zmienną OPTARG.
    i ) btype="kopia przyrostowa"; ;;
    f ) btype="kopia pełna";       ;;
    n ) noinc=1;                   ;;
    ? ) usageQuit                  ;;
  esac
done

shift $(( $OPTIND - 1 ))

echo "Tworzona jest $btype, miejsce zapisu: $output."

timestamp="$(date +'%m%d%I%M')"  # Odczytanie miesiąca, dnia, godziny i minuty
                                 # za pomocą polecenia date. Nie znasz formatu daty?
                                 # Użyj polecenia "man strftime".

if [ "$btype" = "kopia przyrostowa" ] ; then 
  if [ ! -f $tsfile ] ; then
    echo "Błąd: Nie można utworzyć kopii zapasowej, brak pliku z oznaczeniem czasu." >&2
    exit 1
  fi
  find $HOME -depth -type f -newer $tsfile -user ${USER:-LOGNAME} | \
  pax -w -x tar | $compress > $output
  failure="$?"
else
  find $HOME -depth -type f -user ${USER:-LOGNAME} | \
  pax -w -x tar | $compress > $output
  failure="$?"
fi

if [ "$noinc" = "0" -a "$failure" = "0" ] ; then
  touch -t $timestamp $tsfile
fi
exit 0