Shell scripts enclosed

Tanya Katz tanya at adds.newyork.NCR.COM
Fri Mar 10 00:41:46 AEST 1989


Hi System-V ksh users!

I thought it was time I contributed something after receiving lots of
useful information and programs from this group!

Enclosed is a shell archive of useful scripts:

kc   -	BC front-end, which appeared in UnixWorld last year.

CPMV -	Interactive move & copy front-end script (similar to rm -i).  
	Its slower but handy if you tend to cp or mv over things.
	ln CPMV mvi ; ln CPMV cpi 
	In .kshrc: alias cp=cpi & mv=mvi.

rmi -	Interactively remove files by inode number.
	Inspired by the fellow who created the file "-i" and because
	I have done the same type of thing many a time!
 
spellproofer  - Interactive spell checker script. (Requires spell).
		Lets you view the errors in context & correct them as you go.
		Originally appeared in UnixWorld in 1985.

diskcopy -	Front-end to cpio & cpiosize.  Includes man page.
		Change to use afio, if you like.

	Tanya

-=-=-= cut -=-=-= cut -=-=-= cut -=-=- cut -=-=-= cut -=-=-= cut -=-=-= cut -=
# This is a shell archive.  Remove anything before this line!
# Save the results in a file.
# To unpack "sh file".
# To unpack & overwrite existing files, "sh file -c".
#
PATH=/bin:/usr/bin:/u/bin ; export PATH

if test -f CPMV -a "$1" != "-c" 
   then echo file CPMV exists. \"sh $0 -c\" forces overwrite!
   else echo CPMV 1>&2
	cat >CPMV << 'END_OF_CPMV'
#----------------------------------------------------------------
#sccs	"@(#)	CPMV -i 	 Version 1.0"
#
# 		Implements the mv -i & cp -i option like BSD.
# 		Link to cpi & mvi.  Alias mv=mvi & cp=cpi.
#
# Author	Tanya Katz  
#		tanya at adds.newyork.NCR.COM
# ------------------------------------------------------------------------

pgm=`basename $0`

usage()
{
   echo "USAGE: $pgm  f1 f2 \n\t    f1 ... fn d1 \n\t    d1 d2"
   exit 1
}

if [ $# -eq 0 ]
    then usage
fi

dcnt=0; dpos=0; argc=0
DIR=""

if [ "$pgm" = "mvi" ]
    then CPMV="/bin/mv"
    else CPMV="/bin/cp"
fi
    for i in $*
    do
	argc=`expr $argc + 1`
	if [ -d "$i" -o "$i" = "." ]
	    then 
		DIR="$i"
		dpos=$argc
		dcnt=`expr $dcnt + 1`
	else
	    entries="$entries $i"
	fi
    done

    case $dcnt in

	    0) if [ $# -gt 2 ]	# Error too many files.
		then usage
		elif [ -s "$1" -a -s "$2" ]
		then echo "$pgm: $2 exists. Overwrite? \c"
		     read resp
			 case $resp in
			      [yY]* )  $CPMV $1 $2
					    ;;
				   *)   ;;
			         esac
		else $CPMV $1 $2
		fi
		exit $?
		;;

	    1) if [ $dpos -eq $# ]	#directory must be last
	       then break
	       elif [ $dpos -eq 1 -a $# -eq 2 ]  # or first
	       then $CPMV $DIR $2
		    exit $?
	       else usage           #directory in wrong place
	       fi
		;;

	    *)  ;;   	# ignore multiple directories
    esac

    if [ -z "$entries" ]    # no files???
    then usage
    fi

#	If we got here, files are being cp/mv to an existing directory.
#	Any other directories that are located with the source files 
#       are ignored & only the files are being compared...
#
    for i in $entries
    do 
	name=`basename $i`
	if   [ -d $name ]
	then continue
	elif   [ ! -s $i ]
	then echo "$pgm: $i doesn't exist."
	     continue
	fi
	if [ -s $DIR/$name ]
	then echo "$pgm: $DIR/$name exists. Overwrite? \c"
	     read resp
		 case $resp in
		      [yY]* )  $CPMV $i $DIR/$name
			    ;;
		   *)   ;;
	     esac
	else $CPMV $i $DIR/$name
	fi
    done

exit $?
END_OF_CPMV
if test 1995 -ne `wc -c <CPMV`
   then echo sh: "CPMV" unpacked with wrong size!
   fi
fi
# ----- End of CPMV shell code ----- #

if test -f diskcopy -a "$1" != "-c" 
   then echo file diskcopy exists. \"sh $0 -c\" forces overwrite!
   else echo diskcopy 1>&2
	cat >diskcopy << 'END_OF_diskcopy'
# ------------------------------------------------------------------------
#sccs	"@(#)	Diskcopy 	 Version 1.0"
#
# 		CPIO front-end.
#
# Author	Tanya Katz  
#		tanya at adds.newyork.NCR.COM
# ------------------------------------------------------------------------

ARG0=`basename $0`

if [ $# -eq 0 ]
then
	echo "
USAGE: diskcopy -[r|t]
       diskcopy -[c|d|D] directory
       dickcopy -f filename"
	exit 1;
fi

insflop() {

	echo "$ARG0: Please insert the first floppy diskette.
    (q)uit or press <RETURN> \c"
	read resp
	if [ "$resp" = "q" ]
	then
	    exit;
	else echo " "
	fi
}

case $1 in
		"-c")
		    if [ $# != 2 ]
		    then
			echo "USAGE: diskcopy -c Path"
			exit 1;
		    fi

	echo "$ARG0: cpiosize..."
		    find $2 -depth -print | cpiosize -cBv
		    exit 0
		    ;;

		"-r")
	echo "$ARG0: Ready to copy floppy contents to harddisk..."
		    insflop
		    cpio -icvBmd < /dev/rfp021 
		    ;;

		"-t")
		    insflop
		    cpio -ictBv < /dev/rfp021 
		    ;;

		"-d")
		    if  [ ! -d $2 ]
		    then
			echo "USAGE: diskcopy -d Directory"
			echo "$2:  not a directory"
			exit 1;
		    fi
		    echo "cd $2"
		    cd $2
		    insflop
		    find . -print |  cpio -oBcv > /dev/rfp021
		    ;;

		    
		"-D")
		    if [ $# != 2 ]
		    then
			echo "USAGE: diskcopy -D Directory: absolute path"
			exit 1;
		    fi

		    if  [ ! -d $2 ]
		    then
			echo "USAGE: diskcopy -D Directory: absolute path"
			echo "$2:  not a directory"
			exit 1;
		    fi

		    insflop
		    find $2 -print |  cpio -oBcv > /dev/rfp021
		    ;;


		
		"-f")
		    if [ $# != 2 ]
		    then
			echo "USAGE: diskcopy -f filename"
			exit 1;
		    fi

		    if  [ ! -s $2 ]
		    then
			echo "USAGE: diskcopy -f filename"
			echo "$2:  no such file"
		    fi
		    insflop
		    cat $2 |  cpio -oBcv > /dev/rfp021
		    ;;

		*) 
		    echo "
USAGE: diskcopy -[rt]
       diskcopy -[d|D] directory
       diskcopy -f filename"
		    exit 1
		    ;;
esac

if [ $? != 0 ] 
    then 
    echo "$0: ERROR!!  Check the floppy disk & try again.\n"
    exit 1	
else
    echo "$0: done.\n\n"
fi
END_OF_diskcopy
if test 2083 -ne `wc -c <diskcopy`
   then echo sh: "diskcopy" unpacked with wrong size!
   fi
fi
# ----- End of diskcopy shell code ----- #

if test -f diskcopy.1 -a "$1" != "-c" 
   then echo file diskcopy.1 exists. \"sh $0 -c\" forces overwrite!
   else echo diskcopy.1 1>&2
	cat >diskcopy.1 << 'END_OF_diskcopy.1'
'br $Header: diskcopy.1,v 1.20 89/02/05 tfk Exp $
.TH diskcopy 1 local
.SH NAME
.ad
diskcopy \- manipulate archives and files
.SH SYNOPSIS
.B "diskcopy \-"
[
.I t | r
]
.br
.B "diskcopy \-"
[
.I f
] filename
.br
.B "diskcopy \-"
[
.I c | d | D
] directory
.SH DESCRIPTION
.B diskcopy
is a shell script that uses
.I cpio
to manipulate groups of files, copying them between the filesystem and a
floppy
.I cpio
archive.
.SH OPTIONS
.TP 12
.BI \-c "\ path"
Uses 
.I cpiosize 
to estimates the number of floppies necessary to backup
the directory.  Also gives approximate time of the backup.
.TP
.B \-d "\ path"
Change to the named directory before creating the archive.
Creates an archive of paths relative to the current directory.
Will traverse and create sub-directories.
.TP
.B \-D "\ path"
Copy the contents of the directory.  Does not change to the
given directory.  The output is not relative, files have absolute pathnames.
Will traverse and create sub-directories.
.TP
.B \-f "\ filename"
Create a floppy disk archive using the files designated in the
supplied input file.
.TP
.BI \-r 
Read the floppy disk archive and copy the contents to the \fBroot drive\fR.
.TP
.BR \-t
Display the table of contents of the floppy archive.
.SH CAUTION
It is always wise to use the -t option first to check if the archive
is absolute or relative, and to make sure you are in the proper directory
before extracting files from the floppies.
.SH "SEE ALSO"
cpio(1), afio(1).
.SH AUTHOR
Tanya Katz
.br
.I "..!uunet!ncrlnk!adds"
.I "tanya at adds.newyork.ncr.com"
END_OF_diskcopy.1
if test 1547 -ne `wc -c <diskcopy.1`
   then echo sh: "diskcopy.1" unpacked with wrong size!
   fi
fi
# ----- End of diskcopy.1 shell code ----- #

if test -f kc -a "$1" != "-c" 
   then echo file kc exists. \"sh $0 -c\" forces overwrite!
   else echo kc 1>&2
	cat >kc << 'END_OF_kc'
# ------------------------------------------------------------------------
#sccs	"@(#)	KC 	 Version 1.0"
#
# 		BC front-end originally "ksh tool of the month,"
# 		UnixWorld Magazine, April, 1988
#
# ------------------------------------------------------------------------

if [ $# -gt 0 ]
    then
#	exec bc directly with command line arg
	echo "$*" | bc 
	exit 0
    fi
#	force numbers to upper case
typeset -u BCIN
M=0
menu() {
echo "
Kc memory functions:

  m+\tAdd to memory\t\t\tm-    Subtract from memory
  mi\tMemory in (direct)\t\tmr    Memory recall
  mc\tMemory clear\t\t\t=     Print current totals
  +-/*\tMath op using current total\tac    Clear accumulator & memory
"
}
#	put bc in background and set up pipe
    bc -l |&
    print -p "obase=10; ibase=10; scale=2"
    print -p "m=0"
    PROMPT="> "
    echo "Welcome to KC: the k-shell calculator.
Type ? for the help menu.  To quit: q <RETURN>
"
    while :
    do
	if  echo "$PROMPT\c"
	    KBD=`line`
	then
	    case "$KBD" in
	    	help |\?)
			menu
			;;

		q|Q|quit|QUIT)
			exit ;;

		!)	ksh ;;
		!*)	eval "${KBD##!}" ;; #strip off leading !

		m+)	print -p "m = m + ${ANS:=0}; m"
			read -p M
			if [ ! "${M}" = "0" ]
			then
				print - "\tm= $M"
				PROMPT="m> "
			else
				PROMPT="> "
			fi
			;;
		
		m-)	print -p - "m = m - ${ANS:=0}; m"
			read -p M
			if [ ! "${M}" = "0" ]
			then
				print - "\tm= $M"
				PROMPT="m> "
			else
				PROMPT="> "
			fi
			;;

		mi)	print -p - "m = ${ANS:=0}; m"
			read -p M
			if [ ! "${M}" = "0" ]
			then
				print - "\tm= $M"
				PROMPT="m> "
			else
				PROMPT="> "
			fi
			;;
		
		mr)	print -p - "m"
			read -p ANS
			print - "\t$ANS"
			;;

		mc)	print -p "m = 0"
			PROMPT="> "
			;;

		scale)  print -p "scale"
			read -p ANS
			print - "\t$ANS"
			;;
			
		scale*)  print -p "$KBD"
			;;
		
		obase)  print -p "obase"
			read -p ANS
			print - "\t$ANS"
			;;
			
		obase*)  print -p "$KBD"
			;;

		ibase)  print -p "ibase"
			read -p ANS
			print - "\t$ANS"
			;;
			
		ibase*)  print -p "$KBD"
			;;

		/0)	print "divide by 0\007" 
			;;

		/ | \* | + | -) 
			;;

		+* | -* | /* | \**) BCIN="$KBD"
			print -p - "${ANS:=0}${BCIN}"
  			if [ $? -ne 0 ]
			then echo "kc: ${ANS:=0}${BCIN}"
				exit 1
			fi
			read -p ANS
 			print - "\t$ANS"
			;;

		=)	print - "\t${ANS:=0}"
			if [ $M -ne 0 ]
			then print - "\tm= $M"
			fi
			;;

		ac)	print -p "m = 0"
			print -p "0"
			read -p ANS
			print - "\t$ANS"
			PROMPT="> "
			;;

	 	[!G-Zg-z]*)	#matches 0-9 and a-f input
			if [ ! "$KBD" ]
			then continue
			fi
			BCIN="$KBD"
		   	print -p "$BCIN"
			read -p ANS
		   	print - "\t$ANS"
			;;
		esac
	else
		exit
	fi
done
END_OF_kc
if test 2652 -ne `wc -c <kc`
   then echo sh: "kc" unpacked with wrong size!
   fi
fi
# ----- End of kc shell code ----- #

if test -f rmi -a "$1" != "-c" 
   then echo file rmi exists. \"sh $0 -c\" forces overwrite!
   else echo rmi 1>&2
	cat >rmi << 'END_OF_rmi'
# -----------------------------------------------------------------------
#	@(#)rmi    Remove files by inode  - version  1.0 
#
#	Author:    Tanya Katz
#	Date:      2/22/89
# -----------------------------------------------------------------------

if [ $# -eq 0 ]
then
echo "
USAGE: rmi file(s)
"
	exit 1
fi

DOT=`dirname $1`

# get the inode number of  the file. 

FILES=`ls -i $*` 

for INO in $FILES
    do
    case $INO in

	[0-9]*)
		find $DOT -inum $INO -exec rm -i {} \;
		;;
	*) ;;
    esac
done
END_OF_rmi
if test 504 -ne `wc -c <rmi`
   then echo sh: "rmi" unpacked with wrong size!
   fi
fi
# ----- End of rmi shell code ----- #

if test -f spellproofer -a "$1" != "-c" 
   then echo file spellproofer exists. \"sh $0 -c\" forces overwrite!
   else echo spellproofer 1>&2
	cat >spellproofer << 'END_OF_spellproofer'
######################################################################
#
#                            SPELLPROOFER+ 
# 		  Originally appeared in UnixWorld Magazine, 9/85
#
#		  Version 1.0 Copyright 1985 by Michael Elola
#                 Version 1.1 modified 10/85 by Philip Restuccia
# Tanya Katz:     Version 1.2 11/87 ported to UNIX Sys V.
#                 Version 2.0 12/88 Extended interaction & graphics. 
#
# **NOTE:         Nextscr has 2 versions for tput capname capability.
#                 Use the one that best suits your system.
#
######################################################################

trap "/bin/rm -f /tmp/sp[0-3]$$;exit 1" 1 2 3 13 15

FB=`tput smso`
FR=`tput rmso`
ARG0="SPELLPROOFER"
excused=""
term="[^a-zA-Z0-9_]"
filelist="$*"
args=$#
goodspell=1
ERR=/tmp/sp3$$
TMP0=/tmp/sp0$$
TMP1=/tmp/sp1$$
TMP2=/tmp/sp2$$

#########################################################
#    $FB  S P E L L P R O O F E R +      Version 2.0  $FR 
BANNER () {
tput clear
echo "

       S P E L L P R O O F E R +      Version 2.0

"
}
#########################################################
# Nextscr for limited tput capname capability.
#nextscr () { BANNER 
#}

# Nextscr for extensive tput capname capability.
nextscr () { 
    echo `tput cup 4 1`
    echo `tput ed`
}
#########################################################

help1 () {
echo "
    Enter:\n
	? <RETURN>  =	Display $FB $word $FR in context.\n
	  <RETURN>  =	No change.\n
	  Replace $FB $word $FR with \c"
help=1
}
#########################################################

help2 () {
echo "

    Enter:\n
	  <RETURN>  =	No change.\n
	  Replace $FB $word $FR with \c"
help=2
}
#########################################################

nospello () {
nextscr
echo "
No spelling errors detected in:  $filelist\n
Good work $LOGNAME!\n 
"
/bin/rm -f $ERR 2> /dev/null
exit 0
}

#########################################################
#               SCRIPT BEGINS HERE...
#########################################################

case $args in
    0)	echo "USAGE: $ARG0 file(s)"
	exit 1
	;;
	
    1)  skipchk=1
	;;

    *)  skipchk=0
	;;
esac

BANNER
echo "working..."

wordlist=`spell $filelist 2> $ERR`

if [ -z "$wordlist" ]
then
    if [ ! -s $ERR ]
    then    
 	nospello
    else
        nextscr; echo "$FB>>> ERROR >>>$FR \c"
	cat $ERR; echo "\n$ARG0 cannot continue.\n\n"
	/bin/rm $ERR
      	exit 1
    fi
elif [ -s $ERR ]
    then nextscr; echo "$FB>>> ERROR >>>$FR \c"
	cat $ERR;
        echo "\n\n\t\tContinue?  <y/n>   <.>\b\b\c"
	/bin/rm $ERR
	read go
	case $go in
	[Yy]) ;;
	   *) exit 1 ;;
	esac
fi

###  line 127 -- see note below...

while echo "
Use a local dictionary <RETURN=none> named: \c"
do
    read dictionary
    case $dictionary in
    "")	break
	;;

    *)  if [ ! -r $dictionary ]
	then
		echo "$ARG0: can't open $dictionary"
		dictionary=""
		continue
	else
		break
	fi
	;;
    esac
done

for word in $wordlist
do
 
#   Lookup misspelled word in local dictionary.
#
    case $dictionary in
    "") ;;

    *) 	found=`grep -c $word, $dictionary`
    	case $found in
	0) 	;;
	*) 	continue
	  	;;
	esac
	;;
    esac
    goodspell=0
#
#  Display the unmatched word
#
    nextscr
    while [ 1 ]
    do
     if [ -s $TMP2 ]
     then
	     cat $TMP2
	     help2
     else
	     echo "\t\t$FB  $word  $FR"
	     help1
     fi

     read correction

     if [ -n "$correction" ]
     then

	nextscr

	if [ "$correction" = "?" ]
	then 
	     if [ $help -eq 2 ]
	     then 
		 continue
	     fi
	fi

	case $skipchk in

	1) 	hitlist=$filelist
		echo "Searching... \c"
		;;

	0) 	hitlist=""
		echo "Searching files... \c"
		for file in $filelist
		do
		    found=`egrep -c "$word" $file`
		    case $found in
		    0)  ;;
		    *)	hitlist="$hitlist $file"
			;;
		    esac
		done
		;;
	esac

	if [ "$correction" = "?" ]
	then
#
#  Display word in context...
#
	    > $TMP2

	    for file in $hitlist
	    do
		sed < $file > /dev/null "
		    :start
		/$term$word$term/ {
		    s/\($term\)$word\($term\)/\1$FB$word$FR\2/gw $TMP2
		    n
		    bstart
		    }
		/^$word$term/ {
		    s/^$word\($term\)/$FB$word$FR\1/gw $TMP2
		    n
		    bstart
		    }
		/$term$word\$/ {
		    s/\($term\)$word\$/\1$FB$word$FR/gw $TMP2
		    n
		    bstart
		    }
		"
	    done

	    if [ ! -s $TMP2 ]
	    then
		echo " $FB $word $FR not found.\n
>>  Possibly located in nroff macro file?\n\n\t\tPress <RETURN>  <.>\b\b\c"

		if [ -f $TMP2 ]
		then
		    /bin/rm $TMP2
		fi
	        read pause
		nextscr
		break
	    fi
	    nextscr
	    continue
	fi

	> $TMP2

	for file in $hitlist
	do
	    nextscr
	    echo "FILE $file:\n"
#
#  Substitute correction for word...
#
	    sed < $file > $TMP1 "
		:start
		/$term$word$term/ {
		    s/\($term\)$word\($term\)/\1$correction\2/gw $TMP2
		    n
		    bstart
		    }
		/^$word$term/ {
		    s/^$word\($term\)/$correction\1/gw $TMP2
		    n
		    bstart
		    }
		/$term$word\$/ {
		    s/\($term\)$word\$/\1$correction/gw $TMP2
		    n
		    bstart
		    }
	    "
#
#  Highlight corrected word...
#
	    if [ -s $TMP2 ]
	    then
		/bin/mv $TMP2 $TMP0
		sed < $TMP0 > /dev/null "
		    :start
		    /$correction/ {
			s/$correction/$FB$correction$FR/gw $TMP2
			n
			bstart
			}
		"
		cat $TMP2

		echo "
Save corrections in file $file?  <y/n>  <.>\b\b\c"

		/bin/rm -f $TMP2 $TMP0 2> /dev/null

		read response
		case $response in

		y)  /bin/mv -f $TMP1 $file
		    ;;
		*)  /bin/rm -f $TMP1
		    ;;
		esac
            fi
	done     # Correcting word in all files...
	break
    else
	if [ -f $TMP2 ]
	then
	    /bin/rm -f $TMP2
	fi
	excused="$excused $word"
	break
    fi
    done
done

#
#  Build list of possible dictionary entries. 
#

if [ -n "$excused" ]
then
    nextscr
    echo $excused | tr ' ' '\012' | pr -5 -t -l1
    echo "
Do you wish to have some or all of the above words 
entered into a local dictionary file?  <y/n>  <.>\b\b\c"
    read response
    case $response in
	y)  if [ -n "$dictionary" ]
	    then
		echo "
Append to \"$dictionary\"?  <y/n>  <.>\b\b\c"
		read response
		case $response in
		y)    ;;
		*)    dictionary=''
		      ;;
		esac
	    fi
	    if [ -z "$dictionary" ]
	    then
		echo "
Enter new/alternate local dictionary file: \c"
		read dictionary
	    fi
            echo "
Do you wish to be selective?  <y/n>  <.>\b\b\c"
	    read select
	    echo
	    for word in $excused
	    do
		case $select in
		y)  nextscr
		    echo "Include $word?  <y/n>  <.>\b\b\c"
		    read response
		    case $response in
		    y)  echo $word, >> $dictionary   
			  ;;
		    esac
		    ;;
		*)  echo $word, >> $dictionary
		    ;;
	    	esac
	    done
	    ;;
	esac
fi
if [ $goodspell -eq 1 ]
then    
	nospello
else 
	echo "\n\nDone!\n"
	/bin/rm -f $ERR 2> /dev/null
fi
exit 0

###############Insert this on line 127 if spell's errors get put on stdout!
#errlist=$wordlist
#for err in $errlist
#do
#    if [ "$err" = "spell:cannot" ]
#    then nextscr; echo "$FB>>> ERROR >>>$FR  $errlist\n\n"
#	 echo "$ARG0 cannot continue.\n\n"	
#	 /bin/rm $ERR
#	 exit 1
#    else
#	break
#    fi
#done 
##################
END_OF_spellproofer
if test 7079 -ne `wc -c <spellproofer`
   then echo sh: "spellproofer" unpacked with wrong size!
   fi
fi
# ----- End of spellproofer shell code ----- #
#  End of sh archive.

------------------------------------------------------------------------------
      ###   ######  ######   #####     US MAIL: Tanya Katz  
     #   #  #     # #     # #                   ADDS, Inc.
    #     # #     # #     #  #####              100 Marcus Blvd. 
    ####### #     # #     #       #             Hauppauge, N.Y. 11788 
    #     # ######  ######   #####  	 UUCP : ncrlnk!adds!tanya
					        tanya.katz at adds.newyork.NCR.COM
    Applied Digital Data Systems, Inc.   PHONE: (516) 231-5400 X430      
------------------------------------------------------------------------------



More information about the Comp.sys.att mailing list