: ########################################################################## # Title : ibackup - incremental backup # Author : Heiner Steven # Date : 1994-02-03 # Requires : cfcat mklock mkunlock stopword transfer # SCCS-Id. : @(#) ibackup 1.4 04/12/20 ########################################################################## # Description # Incremental backup ########################################################################## PN=`basename "$0"` VER='1.4' : ${BackupRoot:=$HOME} : ${BackupConfigDir:=$HOME/.ibackup} : ${BackupDate:=$BackupConfigDir/backup.date} : ${BackupDirs:=$BackupConfigDir/backup.dir} : ${BackupStop:=$BackupConfigDir/backup.stop} : ${BackupNr:=$BackupConfigDir/backup.nr} # laufende Nummer : ${BackupFile:=$HOME/bkup} # Nummer wird angehaengt datefmt="+%Y-%m-%d %H:%M:%S" if [ $# -gt 0 -a "$1" = "-h" ] then echo >&2 "$PN - Sicherungskopien erstellen, Version $VER Aufruf: $PN [-h] [Verzeichnis ...] Environmentvariablen: BackupRoot Startverzeichnis fuer relative Pfadangaben (Vorgabe: $BackupRoot) BackupDirs Datei mit zu sichernden Verzeichnisnamen (Vorgabe: $BackupDirs) BackupStop Datei mit Dateiei, die nicht zu sichern sind (Vorgabe: $BackupStop) BackupFile Name der zu erstellenden Datei (cpio -c Format) (Vorgabe: $BackupDirs) Alle Pfadangaben muessen absolut (beginnend mit /) sein. Wenn Verzeichnisse angegeben wurden, wird die BackupDirs Environmentvariable ignoriert." exit 0 fi # Remove temp. files at exit trap 'rm -f "$Tmp" "$Neu" "$Liste" >/dev/null 2>&1 mkunlock Backup >/dev/null 2>&1' 0 trap "exit 2" 1 2 3 15 CpioOpt=-o case "`uname`-`uname -r`" in SunOS-5.*) CpioOpt="$CpioOpt -H odc";; *) CpioOpt="$CpioOpt -H newc";; esac set +e # Terminate at errors mklock Backup set -e Neu=${TMPDIR:=/tmp}/ba$$.n Tmp=$TMPDIR/ba$$.0 Liste=$TMPDIR/backup.lst [ -d "$BackupConfigDir" ] || mkdir -p "$BackupConfigDir" || fatal "cannot create configuration directory: $BackupConfigDir" [ -f "$BackupDate" ] || exec date "$datefmt" > "$BackupDate" [ -f "$BackupStop" ] || > "$BackupStop" # Wenn $BackupDirs existiert, dann die dort angegebenen Verzeichnisse # bearbeiten if [ $# -gt 0 ] then Dirs="$@" elif [ -r "$BackupDirs" ] then Dirs=`cfcat "$BackupDirs"` else if [ X"$BackupRoot" = X"$HOME" ] then Dirs="." else Dirs=$HOME fi fi # Liste mit geaenderten Dateien erstellen # "./" aus relativen Pfadnamen entfernen, sortieren cd "$BackupRoot" || exit 1 find $Dirs -type f -newer "$BackupDate" -print | sed 's:^\./::' | sort -u > "$Neu" # Dateien aus der Stopliste ignorieren cfcat "$BackupStop" | sed 's:^\./::' | sort > "$Tmp" cat "$Neu" | stopword "$Tmp" > "$Liste" if [ -s "$Liste" ] then # neuen Backup-Dateinamen ermitteln [ -r "$BackupNr" ] || echo 0 > "$BackupNr" Nr=`cfcat "$BackupNr" | sed q` : ${Nr:=0} echo `expr $Nr + 1` > "$BackupNr" BackupFile="${BackupFile}_$Nr.cpio" # sollte nicht vorkommen: [ -f "$BackupFile" ] && mv "$BackupFile" "$BackupFile.alt" BackupFile=$BackupFile.gz cpio $CpioOpt < "$Liste" | gzip > "$BackupFile" transfer "$BackupFile" && date "$datefmt" > "$BackupDate" fi exit 0