graham@tcom.stc.co.uk (Graham Bardsley) (10/27/89)
The following shell script is a program that I find very useful for manipulating compressed tar files. It's an interface to tar which provides the ability to write compressed files. With it you could write a magtape with for example three times as much data as you would without this but with no added bother. The script adds two extra flags to tar and also the ability to tar across a net. The extra flags are : d - specify the blocking factor for the dd command within ztar. This is used to speed up the pipes and for shoving things across the net. Defaults to 100b (512k). Z - Create/extract a compressed tar archive. For example, to create a compressed archive of a subdirectory tree X use : ztar cfZ X.tar.Z X ztar has the ability to read/write tars across a net - to use this specify the filename like <hostname>:/dev/<tape> I've found ztar very useful (e.g. backing up an entire X11 tree onto one magtape cartridge or taring to a remote drive) Have fun Graham #! /bin/sh # ztar : Compress tar shell script - does compression as it writes/reads a tar # file. Also works across a network! # Tar flags : ctx befFhilmopvw # # additional flags d blocks - blocking factor for dd (default 100 (b)) # Z create/undo a compress file # # To access a remote file/device use 'ztar cf hostname:/dev/mt . ' or # whatever. # # G. Bardsley 1989 # if test "$1" = "" ; then echo "Usage: ztar {cxt}[flags] file ..." >&2 exit 1 fi flags=`echo $1 | sed -e 's/./ &/g'` shift for flag in $flags ; do case $flag in [ctx] ) if test "$op" = "" ; then op=$flag; tarflags=${tarflags}${flag} else echo "Cant mix $op and ${flag} flags" >&2 exit 1 fi;; [eFhilmopvw]) tarflags=${tarflags}${flag};; f ) if test "$device" = "" ; then if test "$1" = "" ; then echo "No argument to take -f from" >&2 exit 1 else device=`echo $1 | sed -e 's/[^:]*:\(.*\)/\1/'` host=`echo $1 | sed -e 's/\([^:]*\):.*/\1/'` if test "$device" = "$host" ; then device=$1 host= fi if test "$device" = "" ; then echo "Null device given in spec $1" >&2 exit 1 fi if test "$host" != "" ; then rsh_in_cmd=" rsh $host -n " rsh_out_cmd=" rsh $host " fi shift fi else echo "Already specified device $device" >&2 exit 1 fi;; b ) if test "$tarblocks" = "" ; then if test "$1" != "" ; then tarblocks=$1 shift tarflags=${tarflags}b else echo "No argument to take -b from" >&2 exit 1 fi else echo "Already specified -b $tarblocks" >&2 exit 1 fi;; d ) if test "$ddblocks" = "" ; then if test "$1" != "" ; then ddblocks=${1}b shift else echo "No argument to take -d from" >&2 exit 1 fi else echo "Already specified -d $ddblocks" >&2 exit 1 fi;; Z ) compress_cmd="| compress " uncompress_cmd="| compress -d ";; * ) echo "Unknown flag $flag" >&2 exit 1;; esac done if test "$op" = "c" ; then if test "$1" = "" ; then echo "Usage: ztar {cxt}[flags] file ..." >&2 exit 1 fi fi if test "$op" = "" ; then echo "Usage: ztar {cxt}[flags] file ..." >&2 exit 1 fi tardirs=$* if test "$device" = ""; then device=`printenv | grep "^TAPE" | sed -e 's/TAPE=//'` fi if test "$device" = ""; then echo "No device specified" >&2 exit 1 fi if test "$host" != "" ; then PATH=/etc:/usr/etc:$PATH export PATH messg=`ping $host` if test "$?" != "0" ; then echo $messg | sed -e 's/.*: /ztar: /' >&2 exit 1 fi fi if test "$ddblocks" = ""; then ddblocks=100b fi if test "$device" != "-"; then in_dev="if=${device}" out_dev="of=${device}" fi trap "/bin/rm -f /tmp/zt$$; exit 0" 0 1 2 3 15 case $op in c ) eval tar ${tarflags}f - $tardirs $compress_cmd | ( $rsh_out_cmd dd ${out_dev} obs=${ddblocks} conv=sync,block 2> /tmp/zt$$) ;; [xt] ) eval '(' $rsh_in_cmd dd ${in_dev} ibs=${ddblocks} 2> /tmp/zt$$ ')' $uncompress_cmd | tar ${tarflags}Bf - ${tardirs};; esac sed -e '/ records /d' /tmp/zt$$ >&2 exit 0 ---- Graham Bardsley,STC Telecoms,Oakleigh Road South,New Southgate, London, N11 1HB ...{uunet,mcvax}!ukc!stc!graham <graham@tcom.stc.co.uk> Tel: +44 1 945 2739 -- ---- Graham Bardsley,STC Telecoms,Oakleigh Road South,New Southgate, London, N11 1HB ..{uunet,mcvax}!ukc!stc!graham <graham@tcom.stc.co.uk> Tel: +44 1 945 2739