Adam Blomberg wrote:
> Essentially, I want to archive a large directory into 2.2 Gbyte tarballs
> which are "spanning" in nature.  I have an 18 Gbyte directory tree that I
> want to compress into a set of 2.2 Gbyte archives so that I can copy the
> individual tarballs onto separate DVD-RAM media later.  It appears that
> the -M (multple) flag only works properly when you actually run out of
> space on the medium you are archiving to.  Is there a way to force tar to
> create iterative files in a specified size?


#!/bin/sh -e
# Kite short term backup script. Back up directories to a spare hard drive.
# This script is complicated a lot by having to ensure that the files arn't
# bigger than 2 gb. It uses multi-volume tar files.

# Configuration section.
DIRS="home var etc root usr/local"
BACKUPDIR=/mirror/kitenet/`hostname`
VERBOSE=""
# This is a bit smaller than 1 cd. It could be up to 2 gb.
VOLUME_SIZE=655360
NEXTFILE=.next

# If this is set, we are being called to change volumes.
if [ "$BACKUP_VOLUME" ]; then
        if [ -e $NEXTFILE ]; then
                n=`cat $NEXTFILE`
        else
                n=1
        fi
        mv -f $BACKUP_VOLUME $BACKUP_VOLUME.$n
        echo `expr 1 + $n` > $NEXTFILE
else
        # Paricular directories to backup can be speicifed, or the
        # whole list is used.
        if [ ! "$1" ]; then
                set -- $DIRS
        fi

        if [ "$VERBOSE" ]; then
                TAR_VERBOSE=-v
        fi
        
        if [ ! -x "$BACKUPDIR" ]; then
                echo "$0: $BACKUPDIR does not exist" >&2
                exit 1
        fi
        
        # Make sure that this script is on the path, even if it was called
        # relatively, before cding, so we can call ourselves later.
        PATH=$PATH:`pwd`
        cd $BACKUPDIR

        # Lock directory.
        if ! mkdir .backup_in_progress; then
                echo "$0: another backup is already in progress" >&2
                exit 2
        fi

        # Do the backups.
        for dir; do
                rm -f $NEXTFILE
                BACKUP_VOLUME=`echo $dir | sed s:/:_:g`.tar
                # So we can see this when asked to change volumes.
                export BACKUP_VOLUME

                # Move all old files out of the way.
                if [ ! -d old ]; then
                        mkdir old
                fi
                mv $BACKUP_VOLUME.* old 2>/dev/null || true
                
                # Use ourselves to change volumes.
                if tar cf $BACKUP_VOLUME /$dir --preserve $TAR_VERBOSE -L 
$VOLUME_SIZE -F $0; then
                        # Move the last file.
                        $0
                        rm -rf old
                else
                        echo "$0: error backing up $dir" >&2
                fi
                rm -f $NEXTFILE
        done
        rm -f $NEXTFILE
        
        rmdir .backup_in_progress
fi

Reply via email to