[comp.sources.unix] v17i073: Zoo archive program, Part10/10

rsalz@uunet.uu.net (Rich Salz) (02/03/89)

Submitted-by: Rahul Dhesi <bsu-cs!dhesi>
Posting-number: Volume 17, Issue 73
Archive-name: zoo2/part10

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 10 (of 10)."
# Wrapped by rsalz@papaya.bbn.com on Thu Feb  2 18:04:06 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'zoo.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'zoo.1'\"
else
echo shar: Extracting \"'zoo.1'\" \(45120 characters\)
sed "s/^X//" >'zoo.1' <<'END_OF_FILE'
X.\"	@(#) zoo.1 2.44 88/08/25 16:05:30 */
X.\"
X.\" For formatting with nroff:
X.\"   tbl zoo.1 | nroff -man | col
X.\" It should be possible to use troff instead of nroff but I haven't
X.\" confirmed this.  R.D.
X.\"
X.TH ZOO 1 "Aug 25, 1988"
X.AT 3
X.de sh
X.br
X.ne 5
X.PP
X\fB\\$1\fR
X.PP
X..
X.SH NAME
Xzoo \- manipulate archives of files in compressed form
X.SH SYNOPSIS
X.B zoo 
X.RB { acfDeghlLPTuUvVx }[ aAcCdEfgImMnNoOpPqSu1:/.@n+\-= ]
Xarchive [file] ...
X.sp 0
X.B zoo \-command 
Xarchive [file] ...
X.sp 0
X.B zoo h
X.SH DESCRIPTION
X.I Zoo
Xis used to create and maintain collections of files in compressed form.
XIt uses a Lempel-Ziv compression algorithm that gives space savings
Xin the range of 20% to 80% depending on the type of file data.
X.I Zoo
Xcan store and selectively extract
Xmultiple generations of the same file.  Data can be recovered
Xfrom damaged archives by skipping the damaged portion
Xand locating undamaged data with the help of
X.I fiz(1).
X.PP
XThis documentation is for version 2.01.  Changes from previous
Xversions are described in the section labelled
X.BR CHANGES .
X.PP
XThe command
X.I zoo 
X.B h
Xgives summary of commands.
X.PP
X.I Zoo 
Xwill not add an archive to itself, nor add the
Xarchive's backup (with 
X.B .bak 
Xextension to the filename) to the archive.
X.PP
X.I Zoo 
Xhas two types of commands:  Expert commands, which consist of one command 
Xletter followed by zero or more modifier characters, and Novice commands, 
Xwhich consist of a hyphen (`\-') followed by a command word that may
Xbe abbreviated.  Expert commands are case-sensitive but Novice commands
Xare not.
X.PP
XWhen 
X.I zoo
Xadds a file to an existing archive, the default action is to maintain 
Xone generation of each file in an archive and 
Xto mark any older generation as deleted.  A limit on the number
Xof generations to save can be specified by the user for
Xan entire archive, or for each file individually, or both.
X.I
XZoo
Xdeletes a stored copy of an added file if necessary to prevent 
Xthe number of stored generations from exceeding the user-specified limit.
X.PP
XDeleted files may be later undeleted.
XArchives may be packed to recover space occupied by deleted files.
X.PP
XAll commands assume that the archive name ends with the characters
X.B .zoo
Xunless a different extension is supplied.  
X.PP
X.B Novice commands
X.PP
XNovice commands may be abbreviated to a hyphen followed by at least
Xone command character.  Each Novice command works in two stages. 
XFirst, the command does its intended work.  Then, if the result was
Xthat one or more files were deleted in the specified archive, the
Xarchive is packed.  If packing occurs, the original unpacked archive
Xis always left behind with an extension of
X.BR .bak .
X.PP
XNo Novice command ever stores the directory prefix of a file.
X.PP
XThe Novice commands are as follows.
X.PP
X.TP 8
X.B \-add
XAdds the specified files to the archive.
X.PP
X.TP
X.B \-freshen
XAdds a specified file to the archive if and only if an older file by
Xthe same name already exists in the archive.
X.PP
X.TP
X.B \-delete
XDeletes the specified files from the archive.
X.PP
X.TP
X.B \-update
XAdds a specified file to the archive either:  if an older file by
Xthe same name already exists in the archive or:  if a file by the
Xsame name does not already exist in the archive.
X.PP
X.TP
X.B \-extract
XExtracts the specified files from the archive.  If no file is specified
Xall files are extracted.
X.PP
X.TP
X.B \-move
XEquivalent to 
X.B \-add
Xexcept that source files are deleted after addition.
X.PP
X.TP
X.B \-print
XEquivalent to 
X.B \-extract
Xexcept that extracted data are sent to standard output.
X.PP
X.TP
X.B \-list
XGives information about the specified archived files including any
Xattached comments.  If no files are
Xspecified all files are listed.  Deleted files are not listed.
X.PP
X.TP
X.B \-test
XEquivalent to
X.B \-extract
Xexcept that the extracted data are not saved but any errors encountered
Xare reported.
X.PP
X.TP
X.B \-comment
XAllows the user to add or update comments attached to archived files.
XWhen prompted, the user may:  type a carriage return to skip the file,
Xleaving any
Xcurrent comment unchanged;  or type a (possibly null) comment of up
Xto 65,535 characters terminated 
Xby
X.B /end
X(case-insensitive) on
Xa separate line;  or type the end-of-file character (normally control D)
Xto skip all remaining files. 
X.PP
X.TP
X.B \-delete
XDeletes the specified files.
X.PP
X.ne 16
X.nf
XThe correspondence between Novice and Expert commands is as follows.
X.PP
X.\" Table formatting for troff thanks to Bill Davidsen <uunet!crdos1!davidsen>
X.sp
X.TS H
Xtab(@);
Xl l l.
XNovice@@Equivalent
XCommand@Description@Expert Command
X_
X\-add@add files to archive@aP:
X\-extract@extract files from archive@x
X\-move@move files to archive@aMP:
X\-test@test archive integrity@xNd
X\-print@extract files to standard output@xp
X\-delete@delete files from archive@DP
X\-list@list archive contents@VC
X\-update@add new or newer files@aunP:
X\-freshen@by add newer files@auP:
X\-comment@add comments to files@c
X.TE
X.fi
X.PD
X.PP
X.sh "Expert commands"
XThe general format of expert commands is:
X.PP
X.I zoo
X.RB { acDeghlLPTuUvVx }[ aAcCdEfImMnNoOpPqSu1:/.@n+\-= ]
Xarchive [file] ...
X.PP
XThe characters enclosed within {} are commands.  Choose any one of
Xthese.  The characters enclosed within [] just to the right of the {}
Xare modifiers and zero or more of these may immediately follow the
Xcommand character.  All combinations of command and modifier characters
Xmay not be valid.
X.PP
XFiles are added to an archive with the command:
X.PP
X.I zoo 
X.RB { au }[ cfIMnPqu:+\- ]
Xarchive [file] ...
X.PP
XCommand characters are:
X.PP
X.TP
X.B a
XAdd each specified file to archive.  Any already-archived copy of 
Xthe file is deleted if this is necessary to avoid exceeding the
Xuser-specified limit on the number of generations of the
Xfile to maintain in the archive.
X.PP
X.TP 
X.B u
XDo an update of the archive.  A specified file is added to the
Xarchive only if a copy of it is already in the archive and the copy
Xbeing added is newer than the copy already in the archive.  
X.PP
XThe following modifiers are specific to these commands.
X.PP
X.TP 
X.B M
XMove files to archive.  This makes 
X.I zoo 
Xdelete (unlink) the original files after they have been added to the
Xarchive.  Files are deleted after addition of all files to the archive is
Xcomplete and after any requested packing of the archive has been done,
Xand only if 
X.I zoo 
Xdetected no errors.
X.PP
X.TP 
X.B n
XAdd new files only.  A specified file is added only if it isn't
Xalready in the archive.
X.PP
X.TP 
X.B P
XPack archive after files have been added.  
X.PP
X.TP
X.B u
XApplied to the
X.B a
Xcommand, this modifier makes it behave identically to the
X.B u
Xcommand.
X.sp 1
XThe combination of the 
X.B n
Xmodifier with the
X.B u
Xmodifier or 
X.B u
Xcommand causes addition of a file to the archive either 
Xif the file is not already in the archive, 
X.I or 
Xif the file is already in the archive but the archived
Xcopy is older than the copy being added.
X.PP
X.TP
X.B :
XDo not store directory names.  In the absence of this modifier
X.I zoo
Xstores the full pathname of each archived file.
X.PP
X.TP
X.B I
XRead filenames to be archived from standard input.  
X.I Zoo 
Xwill read
Xits standard input and assume that each line of text contains a
Xfilename.  Under AmigaDOS and the **IX family, the entire line is used.
XUnder MS-DOS and VAX/VMS,
X.I zoo
Xassumes that the filename is terminated by a blank, tab,
Xor newline; thus it is permissible for the line of text to
Xcontain more than one field separated by white space, and only the
Xfirst field will be used.
X.sp 1
XUnder the **IX family of operating systems, 
X.I zoo
Xcan be used as follows in a pipeline:
X.IP "" 10
Xfind . \-print | 
X.I zoo
XaI sources
X.IP "" 5
X.sp 1
XIf the
X.B I
Xmodifier is specified, no filenames may be supplied on the command
Xline itself.
X.PP
X.TP
X.BR + , \-
XThese modifiers take effect only if the
X.B a
Xcommand results in the creation of a new archive.
X.B +
Xcauses any newly-created archive to have
Xgenerations enabled.
X.B \-
Xis provided for symmetry and causes any newly-created
Xarchive to have generations disabled;  this is also the
Xdefault if neither
X.B +
Xnor
X.B \-
Xis specified.
X.PP
XFiles are extracted from an archive with the command:
X.sp 1
X.I zoo 
X.RB { ex }[ dNoOpqS./@ ]
Xarchive [file] ...
X.PP
XThe 
X.B e 
Xand 
X.B x 
Xcommands are synonymous.  If no file was specified, all files are
Xextracted from the archive.
X.PP
XThe following modifiers are specific to the e and x commands:
X.PP
X.TP 
X.B N
XDo not save extracted data but report any errors encountered.  
X.PP
X.TP
X.B O
XOverwrite files.  Normally, if a file being extracted would 
Xoverwrite an already-existing file of the same name, 
X.I zoo 
Xasks you if
Xyou really want to overwrite it.  You may answer the question with
X`y', which means yes, overwrite; or `n', which means no, don't
Xoverwrite; or `a', which means assume the answer is `y' for this
Xand all subsequent files.  The 
X.B O 
Xmodifier makes 
X.I zoo
Xassume that files may always be overwritten.  Neither
Xanswering the question affirmatively nor using
X.B O
Xalone will cause read-only files to be overwritten.
X.sp 1
XOn **IX systems, however, doubling this modifier as
X.B OO
Xwill force
X.I zoo
Xto unconditionally overwrite any read-protected files 
Xwith extracted files if it can do so.  
X.sp 1
XThe 
X.B O, N, 
Xand 
X.B p 
Xmodifiers are mutually exclusive.
X.PP
X.TP
X.B S
XSupersede newer files on disk with older extracted
Xfiles.
XUnless this modifier is used,
X.I zoo
Xwill not overwrite a newer existing file with an
Xolder extracted file.
X.PP
X.TP
X.B o    
XThis is equivalent to the 
X.B O 
Xmodifier if and only if it
Xis given at least twice.  It is otherwise ignored.
X.PP
X.TP
X.B p    
XPipe extracted data to standard output.  Error messages are piped to 
Xstandard output as well.  However, if a bad CRC is detected, an error
Xmessage is sent both to standard error and to standard output.
X.PP
X.TP
X.B /
XExtract to original pathname.  Any needed directories must already
Xexist.  In the absence of this modifier all files are extracted into
Xthe current directory.  If this modifier is doubled as
X.BR // ,
Xrequired directories need not exist and are created if necessary.
X.PP
XThe management of multiple generations of archived files
Xis done with the commands:
X.sp 1
X.B zoo 
X\fBgl\fR[\fR\fBAq\fR]{\fR\fB+\-=\fR}\fR\fBnumber
X.B archive files ..
X.sp 0
X.B zoo 
X\fBgc\fR[\fR\fBq\fR]{\fR\fB+\-=\fR}\fR\fBnumber
X.B archive files ..
X.sp 0
X.B zoo 
X.BR gA [ q ] "\- archive"
X.sp 0
X.B zoo 
X.BR gA [ q ] "+ archive"
X.sp 1
XThe first form,
X.BR gl ,
Xadjusts the generation limit of selected files by the specified
Xvalue.  If the form
X.B "=n"
Xis used, where n is a decimal number, this sets the generation
Xlimit to the
Xspecified value.  If
X.B +
Xor
X.B \-
Xare used in placed of 
X.B =
Xthe effect is to increment or decrement the generation limit
Xby the specified value.  For example, the command
X.IP "" 5
X.B "zoo gl=5 xyz :"
X.IP "" 0
Xsets the generation limit of each file in the archive
X.B xyz.zoo
Xto a value of 5.  The command
X.IP "" 5
X.B "zoo gl\-3 xyz :"
X.IP "" 0
Xdecrements the generation limit of each file in the archive
Xto 3 less than it currently is.
X.sp 1
XIf the
X.B A
Xmodifier is used, the archive-wide generation limit is
Xadjusted instead.
X.sp 1
XThe number of generations of a file maintained in an archive
Xis limited by the file generation
Xlimit, or the archive generation limit, whichever is lower.
XAs a special case, a generation limit of 0 stands for
Xno limit.  Thus the default file generation limit of
X0 and archive generation limit of 1 limits the number
Xof generations of each file in a newly-created archive to one.
X.sp 1
XThe generation limit specified should be in the range
X0 through 15;  any higher numbers are interpreted modulo
X16.
X.PP
XThe second form of the command, using
X.BR gc ,
Xadjusts the generation count of selected files.  Each file
Xhas a generation count of 1 when it is first added to
Xan archive.  Each time a file by the same name is added
Xagain to an archive, it receives a generation count
Xthat is one higher than the highest generation count
Xof the archived copy of the file.  The permissible 
Xrange of generation counts is 1 through 65535.
XIf repeated manipulations
Xof an archive result in files having very high generation
Xcounts, they may be set back to lower numbers with the
X.B gc
Xcommand.  The syntax of the command is analogous to
Xthe syntax of the 
X.B gl
Xcommand, except that the 
X.B A
Xmodifier is not applicable to the
X.B gc
Xcommand.
X.PP
XThe third form,
X.BR "gA\-" ,
Xdisables generations in an archive.  Generations are
Xoff when an archive is first created, but may be enabled
Xwith the fourth form of the command,
X.BR "gA+" .
XWhen generations are disabled in an archive,
X.I zoo
Xwill not display generation numbers in archive listings
Xor maintain multiple generations.  Generations can
Xbe re-enabled at any time, though manipulation
Xof an archive with repeated interspersed 
X.B "gA\-"
Xand 
X.B "gA+"
Xcommands may result in an archive whose
Xbehavior is not easily understandable.
X.PP
XArchived files are listed with the command:
X.sp 1
X.I zoo
X.RB { lLvV }[ aAcCdfgmqvV@/1+\- ] 
X.RB archive[ .zoo ]
X[file] ...
X.PP
X.TP
X.B l
XInformation presented includes the date and time of each file, its
Xoriginal and current (compressed) sizes, and the percentage
Xsize decrease due to compression (labelled CF or compression factor).
XIf a file was added to the archive in a different timezone,
Xthe difference between timezones is shown in hours as a signed
Xnumber.  As an example, if the difference is listed as +3, this
Xmeans that the file was added to the archive in a timezone
Xthat is 3 hours west of the current timezone.  The file time
Xlisted is, however, always the original timestamp of the
Xarchived file, as observed by the user who archived the file,
Xexpressed as that user's local time.  (Timezone information
Xis stored and displayed only if the underlying operating
Xsystem knows about timezones.)
X.sp 1
XIf no filename is supplied all files are listed except deleted files.
X.sp 1
X.I Zoo
Xselects which generation(s) of a file to list according to
Xthe following algorithm.
X.sp 1
XIf no filename is supplied, only the latest generation of
Xeach file is listed.  If any filenames are specified,
Xand a generation is specified for an argument, only
Xthe requested generation is listed.  If a filename
Xis specified ending with the generation character
X(`:' or `;'), all generations of that file
Xare listed.  Thus a filename argument of the form
X.B zoo.c
Xwill cause only the latest generation of
X.I zoo.c
Xto be listed;  an argument of the form
X.B "zoo.c:4"
Xwill cause generation 4 of
X.I zoo.c 
Xto be listed;  and an argument of the form
X.B "zoo.c:"
Xor
X.B "zoo.c:*"
Xwill cause all generations of
X.I zoo.c
Xto be listed.
X.PP
X.TP
X.B L
XThis is similar to the
X.B l
Xcommand except that all supplied arguments must be archives and all
Xnon-deleted generations of all files in each archive appear in
Xthe listing.
X.sp 1
XOn **IX systems, on which the shell expands arguments, if multiple
Xarchives are to be listed, the
X.B L
Xcommand must be used.  On other systems (VAX/VMS, AmigaDOS,
XMSDOS) on which wildcard expansion is done internally by
X.I zoo,
Xwildcards may be used in the archive name, and a multiple
Xarchive listing obtained, using the
X.B l
Xcommand.
X.PP
X.TP
X.B v
XThis causes any comment attached to the archive to
Xbe listed in addition to the other information.
X.PP
X.TP
X.B V
XThis causes any comment attached to the archive and also any
Xcomment attached to each file to be listed.
X.sp 1
XBoth the
X.B V
Xand
X.B v
Xcommand characters can also be used as modifiers to
Xthe
X.B l
Xand
X.B L
Xcommands.
X.PP
XIn addition to the general modifiers described later, the following 
Xmodifiers can be applied to the archive list commands.
X.PP
X.TP
X.B a
XThis gives a single-line format containing both each filename and the
Xname of the archive, sorted by archive name.  It is especially useful
Xwith the
X.B L
Xcommand, since the result can be further sorted on any field to give a
Xmaster listing of the entire contents of a set of archives.
X.PP
X.TP
X.B A
XThis causes any comment attached to the archive to be listed.
X.PP
X.TP
X.B g
XThis modifier causes file generation information to
Xbe listed about the archive.  For each file listed, the
Xuser-specified generation limit, if any, is listed.  For
Xexample, `3g' for a file means that the user wants no more
Xthan three generations of the file to be kept.  In archives
Xcreated by older versions of
X.I zoo,
Xthe listing will show `\-g',
Xmeaning that no generation information is kept and multiple
Xgenerations of the file are not being maintained.
X.sp 1
XIn addition to the generation information for each file,
Xthe archive-wide generation limit, if any, is shown
Xat the end of the listing.  If generations have been
Xdisabled by the user, this is so indicated, for example:
X.IP "" 10
XArchive generation limit is 3 (generations off).
X.IP "" 5
XFor more information about generations see the
Xdescription of the
X.B g
Xcommand.
X.PP
X.TP
X.B m
XThis modifier is currently applicable to **IX systems only.
XIt causes the mode bits (file protection code) of each
Xfile to be listed as a three-digit octal number.  Currently 
X.I zoo
Xpreserves only the lowest nine mode bits.  Their meanings
Xare as described in the **IX documentation for the
X.I chmod(1)
Xcommand.
X.PP
X.TP
X.B C
XThis modifier causes the stored cyclic redundancy code (CRC) 
Xfor each archived file to be shown as a four-digit hexadecimal 
Xnumber.
X.PP
X.TP
X.B 1
XThis forces one filename to be listed per line.  It is most useful
Xin combination with the
X.B f
Xmodifier.
X.TP
X.B /
XThis forces any directory name to be always listed, even in
Xfast columnized listings that do not normally include any
Xdirectory names.
X.PP
X.TP
X.BR + , \-
XThe
X.B \-
Xmodifier causes trailing generation numbers to be
Xomitted from filenames.
XThe
X.B +
Xmodifier causes the trailing generation numbers to be
Xshown, which is also the default if neither
X.B \-
Xnor 
X.B +
Xis specified.
X.PP
XFiles may be deleted and undeleted from an archive with the following
Xcommands:
X.sp 1
X.I zoo
X.RB { DU }[ Pq1 ]
Xarchive file ...
X.PP
XThe 
X.B D
Xcommand deletes the specified files and the 
X.B U
Xcommand undeletes the specified files.  The
X.B 1
Xmodifier (the digit one, not the letter ell) forces deletion or undeletion
Xof at most one file.  If multiple instances of the same file exist
Xin an archive, use of the
X.B 1
Xmodifier may allow selective extraction of one of these.
X.PP
XComments may be added to an archive with the command:
X.sp 1
X.I zoo
X.BR c [ A ]
Xarchive
X.PP
XWithout the modifier
X.BR A ,
Xthis behaves identically to the
X.B \-comment
Xcommand.  With the modifier
X.BR A ,
Xthe command serves to add or update the comment attached
Xto the archive as a whole.  This comment may be listed with
Xthe
X.B lA, LA, v, and V
Xcommands.  Applying the
X.B cA
Xcommand to an archive that was created with an older version
Xof
X.I zoo
Xwill result in an error message requesting that the user
Xfirst pack the archive with the
X.B P
Xcommand.  This reorganizes the archive and creates space
Xfor the archive comment.
X.PP
XThe timestamp of an archive may be adjusted with the command:
X.sp 1
X.I zoo
X.BR T [ q ]
Xarchive
X.PP
X.I Zoo 
Xnormally attempts to maintain the timestamp of an archive to reflect
Xthe age of the newest file stored in it.  Should the timestamp ever be
Xincorrect it can be fixed with the
X.B T
Xcommand.
X.PP
XAn archive may be packed with the command:
X.sp 1
X.I zoo
X.BR P [ EPq ]
Xarchive
X.PP
XIf the backup copy of the archive already exists, 
X.I zoo
Xwill refuse to
Xpack the archive unless the
X.B P
Xmodifier is also given.  The
X.B E
Xmodifier causes 
X.I zoo
Xnot to save a backup copy of the original archive
Xafter packing.  A unique temporary file in the current directory
Xis used to initially hold the packed archive.  This file will be
Xleft behind if packing is interrupted or if for some reason this
Xfile cannot be renamed to the name of the original archive when
Xpacking is complete.
X.PP
XPacking removes any garbage data appended to an archive because of
XXmodem file transfer and also recovers any wasted space
Xremaining in an archive that has been frequently updated
Xor in which comments were replaced.  Packing also updates
Xthe format of any archive that was created by an older 
Xversion of
X.I zoo
Xso that newer features (e.g. archive-wide generation limit,
Xarchive comment) become fully available.
X.PP
X.I Zoo
Xcan act as a pure compression or uncompression filter,
Xreading from standard input and writing to standard output.
XThis is achieved with the command:
X.sp 1
X.I zoo
X.BR f { cu }
X.PP
Xwhere
X.B c
Xspecifies compression and
X.B u
Xspecifies uncompression.  A CRC value is used to check the
Xintegrity of the data.  The compressed data stream has
Xno internal archive structure and contains multiple
Xfiles only if the input data stream was already structured,
Xas might be obtained, for example, from
X.I tar
Xor
X.I cpio.
X.PP
X Modem transfers can be speeded up with these commands:
X.IP "" 10
X.I zoo
X.B fc
X< file |
X.I sz ...
X.I rz |
X.I zoo
X.B fu
X> file
X.IP "" 5
X.PP
X.sh "General modifiers"
X.PP
XThe following modifiers are applicable to several commands:
X.PP
X.TP 
X.B c
XApplied to the
X.B a
Xand
X.B u
Xcommands, this causes the user to be prompted 
Xfor a comment for each file added to the archive.  If the file
Xbeing added has replaced, or is a newer generation of,
Xa file already in the archive, any comment
Xattached to that file is shown to the user and becomes
Xattached to the newly-added file unless the user changes it.
XPossible user responses are as described for the
X.B \-comment
Xcommand.  Applied to the archive list command
X.BR l ,
Xthe 
X.B c
Xmodifier causes the listing of any comments attached to archived files.
X.PP
X.TP
X.BR \ .
XIn conjunction with
X.B /
Xor
X.B //
Xthis modifier causes any extracted pathname beginning with `/' to be
Xinterpreted relative to the current directory, resulting in 
Xthe possible creation of a subtree rooted at the current directory.
XIn conjunction with the command
X.B P
Xthe
X.B .
Xmodifier causes the packed archive to be created in the current
Xdirectory.  This is intended to allow users with limited disk
Xspace but multiple disk drives to pack large archives.
X.PP
X.TP 
X.B d
XMost commands that act on an archive act only on files that are
Xnot deleted.  The
X.B d
Xmodifier makes commands act on both normal and deleted files.  If
Xdoubled as
X.BR dd ,
Xthis modifier forces selection only of deleted files. 
X.PP
X.TP
X.B f
XApplied to the
X.B a
Xand
X.B u
Xcommands, the
X.B f
Xmodifier causes fast archiving by adding files without compression.
XApplied to
X.B l
Xit causes a fast listing of files in a multicolumn format.
X.PP
X.TP 
X.B q
XBe quiet.  Normally 
X.I zoo
Xlists the name of each file and what action it is performing.  The
X.B q
Xmodifier suppresses this.  When files are being extracted to standard
Xoutput, the
X.B q
Xmodifier suppresses the header preceding each file.  When archive
Xcontents are being listed, this modifier suppresses any header
Xand trailer.  When a fast columnized listing is being obtained,
Xthis modifier causes all output to be combined into a single set
Xof filenames for all archives being listed.
X.sp 1
XWhen doubled as
X.BR qq ,
Xthis modifier suppresses WARNING messages, and when tripled as
X.BR qqq ,
XERROR messages are suppressed too.  FATAL error messages
Xare never suppressed.
X.PP
X.sh "Recovering data from damaged archives"
XThe
X.B @
Xmodifier allows the user to specify the exact position in
Xan archive where
X.I zoo
Xshould extract a file from, allowing damaged portions
Xof an archive to be skipped.
XThis modifier must be immediately followed by a decimal
Xinteger without intervening spaces, and possibly by
Xa comma and another decimal integer, giving a command of
Xthe form
X.B l@m
Xor
X.B l@m,n
X(to list archive contents)
Xor
X.B x@m
Xor
X.B x@m,n
X(to extract files from an archive).  Listing or extraction
Xbegin at position 
X.B m
Xin the archive.
XThe value of
X.B m
Xmust be the position within the archive of an
Xundamaged directory entry.  This position is usually obtained from
X.I fiz(1)
Xversion 2.0 or later.
X.sp 1
XIf damage to the archive has shortened or lengthened it, all
Xpositions within the archive may be changed by some constant amount.
XTo compensate for this, the value of
X.B n
Xmay be specified.  This value is also usually obtained from
X.I fiz(1).
XIt should be the position in the archive of the file data
Xcorresponding to the directory entry that has been specified
Xwith 
X.BR m .
XThus if the command
X.B x@456,575
Xis given, it will cause the first 456 bytes of the archive to
Xbe skipped and extraction to begin at offset 456;  in addition,
X.I zoo
Xwill attempt to extract the file data from position 575 in the archive
Xinstead of the value that is found in the directory entry
Xread from the archive.
XFor example, here is some of the output of 
X.I fiz
Xwhen it acts on a damaged 
X.I zoo
Xarchive:
X.sp 1
X.nf
X****************
X    2526: DIR  [changes] ==>   95
X    2587: DATA
X****************
X    3909: DIR  [copyrite] ==> 1478
X    3970: DATA
X    4769: DATA
X****************
X.fi
X.sp 1
XIn such output, 
X.B DIR
Xindicates where 
X.I fiz
Xfound a directory entry in the archive, and
X.B DATA
Xindicates where 
X.I fiz
Xfound file data in the archive.  Filenames located by
X.I fiz
Xare enclosed in square brackets, and the notation
X"==>   95" indicates that the directory entry found by
X.I fiz
Xat position 2526 has a file data pointer to
Xposition 95.  (This is clearly wrong,
Xsince file data always occur in an archive 
X.I after
Xtheir directory entry.)  In actuality,
X.I fiz
Xfound file data at positions 2587, 3970, and
X4769.  Since 
X.I fiz
Xfound only two directory entries, and each directory entry
Xcorresponds to one
Xfile, one of the file data positions is an artifact.
X.PP
X.sp 1
XIn this case, commands to try giving to 
X.I zoo
Xmight be
X.B x@2526,2587
X(extract beginning at position 2526, and get file data
Xfrom position 2587),
X.B x@3090,3970
X(extract at 3090, get data from 3970)
Xand
X.B x@3909,4769
X(extract at 3909, get data from 4769).  Once a correctly-matched
Xdirectory entry/file data pair is found,
X.I zoo
Xwill in most cases synchronize with and correctly extract all files
Xsubsequently found in the archive.  Trial and error should allow
Xall undamaged files to be extracted.
XAlso note that self-extracting archives created using
X.I sez
X(the Self-Extracting
X.I Zoo
Xutility for MS-DOS), which are normally executed on an MS-DOS
Xsystem for extraction, can
Xbe extracted on non-MSDOS systems using 
X.I "zoo's"
Xdamaged-archive recovery method using the
X.B @
Xmodifier.
X.PP
X.sh "Wildcard handling"
XUnder the **IX family of operating systems, 
Xthe shell normally expands wildcards to a list of matching files.  Wildcards 
Xthat are meant to match files within an archive must therefore
Xbe escaped or quoted.  When selecting files to be added to an archive,
Xwildcard conventions are as defined for the shell.  When selecting
Xfiles from within an archive, wildcard handling is done by
X.I zoo
Xas described below.
X.PP
XUnder MS-DOS and AmigaDOS, quoting of wildcards is not needed.
XAll wildcard expansion of filenames is done by
X.I zoo,
Xand wildcards inside directory names are expanded only
Xwhen listing or extracting files but not when adding them.
X.PP
XThe wildcard syntax interpreted by 
X.I zoo
Xis limited to the following characters.
X.PP
X.TP
X.B *
XMatches any sequence of zero or more characters.
X.PP
X.TP
X.B \?
XMatches any single character.
X.sp 1
XArbitrary combinations of 
X.B *
Xand 
X.B ?
Xare allowed.
X.PP
X.TP
X.B /
XIf a supplied pattern contains a slash anywhere in it, then the
Xslash separating any directory prefix from the filename must be
Xmatched explicitly.  If a supplied pattern contains
Xno slashes, the match is selective only on the filename.
X.PP
X.TP
X.B c\-c
XTwo characters separated by a hyphen specify a character range.  All
Xfilenames beginning with those characters will match.  The character
Xrange is meaningful only by itself or preceded by a directory name.
XIt is not specially interpreted if it is part of a filename.
X.PP
X.TP
X.B ": and ;"
XThese characters are used to separate a filename from a generation
Xnumber and are used when selecting specific generations
Xof archived files.  If no generation character is used, the
Xfilename specified matches only the latest generation of the
Xfile.  If the generation character is specified,
Xthe filename and the generation are matched independently by
X.I "zoo's"
Xwildcard mechanism.  If no generation is
Xspecified following the
X.B ":"
Xor
X.B ";"
Xcharacter, all generations of that file will match.  As
Xa special case, a generation number of
X.B 0
Xmatches only the latest generation of a file, while
X.B ^0
Xmatches all generations of a file except the
Xlatest one.  If no
Xfilename is specified preceding the generation character,
Xall filenames will match.  As a corollary, the generation
Xcharacter by itself matches all generations of all files.
X.PP
XMS-DOS users should note that 
X.I zoo 
Xdoes not treat the dot as
Xa special character, and it does not ignore characters following
Xan asterisk.  Thus 
X.B * 
Xmatches all filenames;
X.B *.* 
Xmatches
Xfilenames containing a dot;
X.B *_* 
Xmatches filenames
Xcontaining an underscore;  and 
X.B *z 
Xmatches all filenames
Xthat end with the character 
X.BR z ,
Xwhether or not they contain
Xa dot.
X.PP
X.sh "Usage hints"
XThe Novice command set in
X.I zoo
Xis meant to provide an interface with functionality and
Xformat that will be familiar to users of other similar
Xarchive utilities.  In keeping with this objective,
Xthe Novice commands do not maintain or use any subdirectory
Xinformation or allow the use of
X.I "zoo's"
Xability to maintain multiple generations of files.
XFor this reason, users should switch to exclusively
Xusing the Expert commands as soon as possible.
X.PP
XAlthough the Expert command set is quite large, it should
Xbe noted that in almost every case, all legal modifiers
Xfor a command are fully orthogonal.  This means that the
Xuser can select any combination of modifiers, and when they
Xact together, they will have the intuitively obvious effect.
XThus the user need only memorize what each modifier does,
Xand then can combine them as needed without much further thought.
X.PP
XFor example, consider the 
X.B a
Xcommand which is used to add files to an archive.  By itself,
Xit simply adds the specified files.  To cause only already-archived
Xfiles to be updated if their disk copies have been modified,
Xit is only necessary to add the
X.B u
Xmodifier, making the command
X.BR au .
XTo cause only new files (i.e., files not already in
Xthe archive) to be added, the
X.B n
Xmodifier is used to create the command
X.BR an .
XTo cause 
X.I both
Xalready-archived files to be updated and new files
Xto be added, the
X.B u
Xand
X.B n
Xmodifiers can be used together, giving the command
X.BR aun .
XSince the order of modifiers is not significant, the
Xcommand could also be
X.BR anu .
X.PP
XFurther, the
X.B c
Xmodifier can be used to cause
X.I zoo
Xto prompt the user for a comment to attach to
Xeach file added.  And the
X.B f
Xmodifier can cause fast addition (addition without
Xcompression).  It should be obvious then that the
Xcommand
X.B auncf
Xwill cause
X.I zoo
Xto update already-archived files, add new files,
Xprompt the user for comments, and do the addition
Xof files without any compression.  Furthermore,
Xif the user wishes to move files to the archive,
Xi.e., delete the disk copy of each file after it
Xis added to the archive, it is only necessary to add
Xthe
X.B M
Xmodifier to the command, so it becomes
X.BR auncfM .
XAnd if the user also wishes to cause the archive
Xto be packed as part of the command, thus recovering
Xspace from any files that are replaced, the command
Xcan be modified to
X.B auncfMP
Xby adding the
X.B P
Xmodifier that causes packing.
X.PP
XSimilarly, the archive listing commands can be built up
Xby combining modifiers.  The basic command to list the
Xcontents of an archive is
X.BR l .
XIf the user wants a fast columnized listing, the
X.B f 
Xmodifier can be added to give the
X.B lf
Xcommand.  Since this listing will have a header giving
Xthe archive name and a trailer summarizing interesting
Xinformation about the archive, such as the number
Xof deleted files, the user may wish to "quieten" the
Xlisting by suppressing these;  the relevant modifier
Xis
X.BR q ,
Xwhich when added to the command gives
X.BR lfq .
XIf the user wishes to see the **IX mode (file protection)
Xbits, and also information about multiple generations,
Xthe modifiers
X.B m
X(show mode bits) and
X.B g
X(show generation information) can be added, giving the
Xcommand
X.BR lfqmg .
XIf the user also wishes to see an attached archive
Xcomment, the modifier
X.B A
X(for archive) will serve.  Thus the command
X.B lfqmgA
Xwill give a fast columnized listing of the archive,
Xsuppressing any header and trailer, showing mode bits
Xand generation information, and showing any comment
Xattached to the archive as a whole.  If in addition
Xindividual comments attached to files are also needed,
Xsimply append the
X.B c
Xmodifier to the command, making it
X.BR lfqmgAc .
XThe above command will not show any deleted files, 
Xhowever;  to see them, use the
X.B d
Xmodifier, making the command
X.B lfqmgAcd
X(or double it as in
X.B lfqmgAcdd
Xif 
X.I only 
Xthe deleted files are to be listed).  And if the user
Xalso wishes to see the CRC value for each file being listed,
Xthe modifier
X.B C
Xwill do this, as in the command
X.BR lfqmgAcdC ,
Xwhich gives a fast columnized listing of all files, including
Xdeleted files, showing any archive comment and file comments,
Xand file protection codes and generation information, as
Xwell as the CRC value of each file.
X.PP
XNote that the above command
X.B lfqmgAcdC
Xcould also be abbreviated to
X.B VfqmgdC
Xbecause the command
X.B V
Xis shorthand for
X.B lcA 
X(archive listing with all comments shown).
XSimilarly the command
X.B v
Xis shorthand for
X.BR lA
X(archive listing with archive comment shown).  Both
X.B V
Xand 
X.B v
Xcan be used as modifiers to any of the other archive
Xlisting commands.
X.PP
X.sh "Generations"
XBy default,
X.I zoo
Xassumes that only the latest generation of a specified file
Xis needed.  If generations other than the latest one
Xneed to be selected, this may be done by specifying them
Xin the filename.  For example, the name
X.B stdio.h
Xwould normally refer to the latest generation of
Xthe file
X.I stdio.h
Xstored in a 
X.I zoo
Xarchive.  To get an archive listing showing all
Xgenerations of
X.I stdio.h 
Xin the archive, the specification
X.B stdio.h:*
Xcould be used (enclosed in single quotes if necessary
Xto protect the wildcard character
X.B *
Xfrom the shell).  Also,
X.B stdio.h:0
Xselects only the latest generation of
X.I stdio.h,
Xwhile
X.B stdio.h:^0
Xselects all generations except the latest one.  The 
X.B :
Xcharacter here separates the filename from the generation
Xnumber, and the character
X.B *
Xis a wildcard that matches all possible generations.
XFor convenience, the generation itself may be left
Xout, so that the name
X.B stdio.h:
X(with the
X.B :
Xbut without a generation number or a wildcard) matches
Xall generations exactly as
X.B stdio.h:*
Xdoes.
X.PP
XIf a generation is specified but no filename is present,
Xas in
X.BR :5 ,
X.BR :* ,
Xor just
X.BR : ,
Xall filenames of the specified generation will be selected.
XThus
X.B :5
Xselects generation 5 of each file, and
X.B :*
Xand
X.B :
Xselect all generations of all files.
X.PP
XIt is important to note that
X.I "zoo's"
Xidea of the latest generation of a file is not based
Xupon searching the entire archive.  Instead, whenever
X.I zoo
Xadds a file to an archive, it is marked
Xas being the latest generation.  Thus, if
Xthe latest generation of a file is deleted, then
X.I no
Xgeneration of that file is considered the latest any
Xmore.  This can be surprising to the user.  For
Xexample, if an archive already contains the file
X.I stdio.h:5
Xand a new copy is added, appearing in the archive
Xlisting as
X.I stdio.h:6,
Xand then
X.I stdio.h:6
Xis deleted, the remaining copy
X.I stdio.h:5
Xwill no longer be considered to be the latest generation,
Xand the file
X.I stdio.h:5,
Xeven if undeleted, will no longer appear in an archive listing
Xunless generation 5 (or every generation) is specifically requested.
XThis behavior will likely be improved in future releases of
X.I zoo.
X.SH FILES
XxXXXXXX \- temporary file used during packing
X.sp 0
X.RB archive_name. bak
X\- backup of archive
X.SH "SEE ALSO"
Xcompress(1), fiz(1)
X.SH BUGS
XWhen files are being added to an archive on a non-MS-DOS system, it
Xis possible for
X.I zoo
Xto fail to detect a full disk and hence create an invalid archive.
XThis bug will be fixed in a future release.
X.PP
XFiles with generation counts that wrap around from 65535 to 1
Xare not currently handled correctly.  If a file's generation
Xcount reaches a value close to 65535, it should be manually
Xset back down to a low number.  This may be easily done
Xwith a command such as
X.BR gc\-65000 ,
Xwhich subtracts 65000 from the generation count of each
Xspecified file.  This problem will be fixed in a
Xfuture release.
X.PP
XAlthough
X.I zoo
Xon **IX systems preserves the lowest nine mode bits of
Xregular files, it does not currently do the same for directories.
X.PP
XCurrently
X.I "zoo's"
Xhandling of the characters
X.B :
Xand 
X.B ;
Xin filenames is not robust, because it interprets these
Xto separate a filename from a generation number.  A
Xquoting mechanism will eventually be implemented.
X.PP
XStandard input cannot be archived nor can a created archive be sent
Xto standard output.  Spurious error messages may appear if the 
Xfilename of an archive is too long.
X.PP
XSince
X.I zoo
Xnever archives any file with the same name as the archive or its
Xbackup (regardless of any path prefixes), care should be taken 
Xto make sure that a file to be archived does not coincidentally have 
Xthe same name as the archive it is being added to.
XIt usually suffices 
Xto make sure that no file being archived is itself a 
X.I zoo
Xarchive.  (Previous versions of
X.I zoo
Xsometimes tried to add an
Xarchive to itself. This bug now seems to be fixed.)
X.PP
XOnly regular files are archived; devices and empty directories are not.
XSupport for archiving empty directories and for preserving directory
Xattributes is planned for the near future.
X.PP
XEarly versions of MS-DOS have a bug that prevents "." from referring
Xto the root directory;  this leads to anomalous results if the
Xextraction of paths beginning with a dot is attempted.
X.PP
XVAX/VMS destroys case information unless arguments are enclosed
Xin double quotes.  For this reason if a command given to
X.I zoo
Xon a VAX/VMS system includes any uppercase characters, it must be 
Xenclosed in double quotes.  Under VAX/VMS,
X.I zoo
Xdoes not currently restore file timestamps;  this will be fixed
Xas soon as I figure out RMS extended attribute blocks, or DEC supplies
Xa utime() function, whichever occurs first.  Other VMS bugs, related to
Xfile structures, can often be overcome by using the program 
X.I bilf.c
Xthat is supplied with
X.I zoo.
X.PP
XIt is not currently possible to create a
X.I zoo
Xarchive containing all
X.I zoo
Xarchives that do not contain themselves.
X.SH DIAGNOSTICS
XError messages are intended to be self-explanatory and are divided into
Xthree categories.  WARNINGS are intended to inform the user of an
Xunusual situation, such as a CRC error during extraction, or
X.BR \-freshen ing
Xof an archive containing a file newer than one specified on
Xthe command line.  ERRORS are fatal to one file, but execution
Xcontinues with the next file if any.  FATAL errors cause execution to
Xbe aborted.  The occurrence of any of these causes an exit status of
X1.  Normal termination without any errors gives an exit status of 0.
X(Under VAX/VMS, however, to avoid an annoying message,
X.I zoo
Xalways exits with an error code of 1.)
X.SH COMPATIBILITY
XAll versions of
X.I zoo
Xon all systems are required to create archives that can
Xbe extracted and listed with all versions of 
X.I zoo
Xon all systems, regardless of filename and
Xdirectory syntax or archive structure;  furthermore,
Xany version of 
X.I zoo
Xmust be able to fully manipulate all archives
Xcreated by all lower-numbered versions of
X.I zoo
Xon all systems.  So far as I can tell, this
Xupward compatiblity (all manipulations) and downward
Xcompatiblity (ability to extract and list)
Xis maintained by
X.I zoo
Xversion 2.0.
XYou are forbidden, with the force of
Xcopyright law, to create from the
X.I zoo
Xsource code any derivative work
Xthat violates this compatibility goal,
Xwhether knowingly or through negligence.
XIf any violation of this
Xcompatibility goal is observed\(emi.e.,
Xif you are able to use an implementation of
X.I zoo
Xto create an archive
Xthat some implementation of
X.I zoo
Xon any system cannot extract\(emthis should be
Xconsidered a serious problem and reported to me.
X.SH CHANGES
XHere is a list of changes occurring from version 1.50 to
Xversion 2.01.  In parentheses is given the version in which each
Xchange occurred.
X.TP
X\-
X(1.71) New modifiers to the list commands permit
Xoptional suppression of header and trailer information, 
Xinclusion of directory names in columnized listings, and 
Xfast one-column listings.
X.TP
X\-
X(1.71) Timezones are handled.
X.TP
X\-
X(1.71) A bug was fixed that had made it impossible to
Xindividually update comments for a file whose name did
Xnot correspond to MS-DOS format.
X.TP
X\-
X(1.71) A change was made that now permits use of the
Xshared library on the **IX PC.
X.TP
X\-
X(1.71) VAX/VMS is now supported reasonably well.
X.TP
X\-
X(2.00) A comment may now be attached to the archive itself.
X.TP
X\-
X(2.00) The \fBOO\fR option allows
Xforced overwriting of read-only files.
X.TP
X\-
X(2.00) \fIZoo\fR will no longer extract a file if a 
Xnewer copy already exists on disk;  the
X.B S
Xoption will override this.
X.TP
X\-
X(2.00) File attributes are preserved for **IX systems.
X.TP
X\-
X(2.00) Multiple generations of the same file are supported.
X.TP
X\-
X(2.00) \fIZoo\fR will now act as a compression or
Xdecompression filter on a stream of data and will
Xuse a CRC value to check the integrity of a
Xdata stream that is uncompressed.
X.TP
X\-
X(2.00) A bug was fixed that caused removal of a directory link
Xif files were moved to an archive by the superuser
Xon a **IX system.
X.TP
X\-
X(2.00) The data recovery modifier
X.B @
Xwas greatly enhanced.  Self-extracting archives created for MS-DOS
Xsystems can now be extracted by 
X.I zoo
Xon any system with help from 
X.I fiz(1).
X.TP
X\-
X(2.01)
XA bug was fixed that had caused the first generation of a file
Xto sometimes unexpectedly show up in archive listings.
X.TP
X\-
X(2.01) A bug was fixed that had caused the MS-DOS version
Xto silently skip files that could not be extracted because
Xof insufficient disk space.
X.TP
X\-
X(2.01) A bug was fixed that had sometimes made it impossible to
Xselectively extract a file by specifying its name, even 
Xthough all files could be extracted from the archive
Xby not specifying any filenames.  This occurred when
Xa file had been archived on a longer-filename system
X(e.g. AmigaDOS) and extraction was attempted on a
Xshorter-filename system (e.g. MS-DOS).
X.TP
X\-
X(2.01) A change was made that will make zoo preserve the mode
X(file protection) of a zoo archive when it is packed.
XThis is effective only if zoo is compiled to preserve
Xand restore file attributes.  Currently this is so
Xonly for **IX systems.
X.TP
X\-
X(2.01) 
XA bug was fixed that had caused an update of an archive to
Xnot always add all newer files.
X.TP
X\-
X(2.01) Blanks around equal signs in commands given to "make"
Xwere removed from the mk* scripts for better compatiblity
Xwith more **IX implementations including Sun's.
X.SH "FUTURE DIRECTIONS"
XA revised version of 
X.I zoo
Xis in the works that will be able to write newly-created archives
Xto standard output, and will also automatically perform end-of-line 
Xconversion for text files moved between dissimilar systems.
XIt will be upward and downward compatible with existing versions of 
X.I zoo.
X.SH ACKNOWLEDGEMENTS
XThe 
X.I zoo
Xarchiver was initially developed using Microsoft C 3.0
Xon a PC clone manufactured
Xby Toshiba of Japan and almost sold by Xerox.  Availability
Xof the following systems was helpful in achieving portability:
XPaul Homchick's Compaq running Microport System V/AT;  The 
XEskimo BBS somewhere in Oregon running Xenix/68000; Greg Laskin's
Xsystem 'gryphon' which is an Intel 310 running Xenix/286;  Ball 
XState University's AT&T 3B2/300, UNIX PC, and VAX-11/785 (4.3BSD)
Xsystems.  In addition J. Brian Waters provided feedback to
Xhelp me make the code compilable on his Amiga using
XManx/Aztec C.  More recently, actual development, as
Xopposed to portability testing, has been done exclusively
Xon my own AT from PC's Limited running Microport System V/AT.
XThe executable version 2.0 for MS-DOS is currently
Xcompiled with Borland's Turbo C 1.0.
X.PP
XSpecial thanks are due to:
X.PP
XJ. Brian Waters <uunet!bsu-cs!jbwaters>, who has worked
Xdiligently to port
X.I zoo
Xto AmigaDOS, created Amiga-specific code,
Xand continues keeping it updated.
X.PP
XPaul Homchick <rutgers!cgh!paul>, who provided numerous detailed
Xreports about some nasty bugs.
X.PP
XBill Davidsen <steinmetz!crdos1!davidsen>, who fixed
X.I "zoo's"
Xhandling of daylight savings time, provided changes to make this
Xmanual format correctly with
X.I troff,
Xand provided many useful bug reports and suggestions.
X.PP
XMark Alexander <amdahl!drivax!alexande>, who provided me with some bug
Xfixes, and also some portability modifications and
Xspeed optimizations
Xthat are due to be incorporated into the next release.
X.SH AUTHOR
XRahul Dhesi
END_OF_FILE
if test 45120 -ne `wc -c <'zoo.1'`; then
    echo shar: \"'zoo.1'\" unpacked with wrong size!
fi
# end of 'zoo.1'
fi
echo shar: End of archive 10 \(of 10\).
cp /dev/null ark10isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 10 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.