shar--yet another shell archiver
Sjoerd Mullender
sjoerd at tjalk.UUCP
Thu Dec 20 06:05:09 AEST 1984
Here is a shell archiver written in the Bourne shell.
It will archive the files and directories given to it as its arguments
(current directory default). If it comes across a directory the
contents of the directory will be archived also. The modes of the
files and directories will be restored.
Usage is:
shar [ -o output ] [ -r ] [ files and directories ]
The options it recognizes are:
-o output The archive will come in the file output
(standard output default).
-r Do not archive subdirectories.
Even if you don't want this program, it is worth looking at.
8<---------CUT HERE---------------------HERE TOO---------------------
: This is a shar archive. Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
echo 'Extracting shar'
sed 's/^X//' > shar << '+ END-OF-FILE shar'
X: Usage message.
Xusage="Usage: $0 [ -o output ] [ -r ] [ file ] ..."
X: Output file -- standard output default.
Xoutput=''
X: Separator.
Xseparator='+ END-OF-FILE'
X: Default is: recursively archive subdirectories.
Xrecurse=yes
X: Procedure to set the mode of the file to the correct value.
Xchmod='
X ls="`/bin/ls -ld $f`"
X echo "chmod '\''`echo $ls | sed -e '\''s/.\(...\)\(...\)\(...\).*/u=\1,g=\2,o=\3/'\'' -e '\''s/-//g'\''`'\'' '\''$f'\''"
X'
X: Procedure to archive the file / directory
Xshar='
X if test -d $f
X then : We have a directory here.
X case $recurse in
X yes) : Check whether there is a file with the same name
X : if so, remove it.
X echo "if test -f '\''$f'\''"
X echo "then rm '\''$f'\''"
X echo "fi"
X : If the directory does not yet exist, create it.
X echo "if test -d '\''$f'\''"
X echo "then :"
X echo "else echo '\''Making $f/'\''"
X echo " mkdir '\''$f'\''"
X echo "fi"
X : Change the mode of the directory to the correct value.
X eval "$chmod"
X : Now archive the contents of the directory.
X for f in $f/*
X do : Recursive call.
X eval "$shar"
X done
X esac
X else : We have a file.
X echo "echo '\''Extracting $f'\''"
X echo "sed '\''s/^X//'\'' > $f << '\''$separator $f'\''"
X : Here the file is put into the archive.
X sed '\''s/^/X/'\'' $f
X : End with the separator.
X echo "$separator $f"
X : Change the mode of the file to the correct value.
X eval "$chmod"
X : Show the size of the file as sent.
X echo "echo '\'' $ls (as sent)'\''"
X : Show the size of the file as received.
X echo "echo -n '\'' '\''"
X echo "/bin/ls -l $f"
X fi
X'
Xfor arg
Xdo case $arg in
X -o) : Output file name.
X : Get rid of the -o.
X shift
X : Is there an argument left?
X case $# in
X 0) : No. Exit with an error message.
X echo "$usage" 1>&2
X exit 1
X esac
X : Yes.
X output="$1"
X ;;
X -o*) : Output file name.
X output=`expr "$arg" : '-o\(.*\)'`
X ;;
X -r) : Do not archive subdirectories.
X recurse=no
X ;;
X -*) : Unknown option.
X echo "$usage" 1>&2
X exit 1
X ;;
X *) : Break out of the for loop.
X break
X esac
X shift
Xdone
X: If no arguments left. Archive current directory.
Xcase $# in
X0) set *
Xesac
X: Redirect output if necessary.
Xcase "X$output" in
XX) ;;
X*) exec >"$output"
Xesac
Xecho ': This is a shar archive. Extract with sh, not csh.'
Xecho ': This archive ends with exit, so do not worry about trailing junk.'
X: Here the work is being done.
Xfor f in $*
Xdo eval "$shar"
Xdone
X: Let the archive end with an exit.
Xecho 'exit 0'
Xexit 0
+ END-OF-FILE shar
chmod 'u=rwx,g=rx,o=rx' 'shar'
echo ' -rwxr-xr-x 2 sjoerd 2473 Dec 19 19:45 shar (as sent)'
echo -n ' '
/bin/ls -l shar
exit 0
--
Sjoerd Mullender
...!{decvax,philabs,seismo}!mcvax!vu44!sjoerd
More information about the Comp.sources.unix
mailing list