home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume19 / backup / getback.sh < prev    next >
Linux/UNIX/POSIX Shell Script  |  1989-06-29  |  2KB  |  110 lines

  1. #!/bin/sh
  2. # getback [-o /backup] filename
  3.  
  4. PATH=/bin:/usr/bin:/usr/ucb; export PATH
  5. BACKUP=/backup
  6. myname=`basename $0`
  7. TMP=/tmp/${myname}$$
  8. USER=${USER-`whoami`} || exit
  9.  
  10. usage() {
  11.     echo "Usage: $myname [-o /backup] filename" 1>&2
  12.     exit 1
  13. }
  14. sorry() {
  15.     echo "Sorry, there are no online backups of $filename"
  16.     exit 1
  17. }
  18. giveup() {
  19.     echo "$myname: nothing changed"
  20.     exit 1
  21. }
  22.  
  23. set -- `getopt o: $*`
  24. if [ $? != 0 ]; then
  25.     usage
  26. fi
  27. for i in $*; do
  28.     case $i in
  29.     -o) BACKUP=$2; shift 2;;
  30.     --) shift; break;;
  31.     esac
  32. done
  33.  
  34. if [ $# != 1 ]; then
  35.     echo "$myname: missing filename" 1>&2
  36.     usage
  37. fi
  38.  
  39. filename=$1
  40. case $filename in
  41. /*) backdir=$BACKUP$1;;
  42. *)  backdir=$BACKUP`/bin/pwd`/$1;;
  43. esac
  44.  
  45. test -d $backdir || sorry
  46. trap "/bin/rm -f $TMP; exit" 0 1 2 15
  47. # We could ensure that the backup filenames look reasonable here...
  48. ls -lrt $backdir | awk "\$1 ~ /^-/ && \$3 == \"$USER\"" >$TMP
  49. ncopies=`sed -n '$=' $TMP`
  50. case $ncopies in
  51. 1)
  52.     set -- `cat $TMP`
  53.     echo "There is only one backup of \"$filename\", dated $5 $6 $7"
  54.     echo -n "Retrieve this copy [y] ? "
  55.     read ans
  56.     case "$ans" in
  57.     "" | y* | Y* ) ;;
  58.     *) giveup;;
  59.     esac
  60.     ;;
  61. [0-9]*)
  62.     echo "There are $ncopies backup versions of \"$filename\" from:"
  63.     echo ""
  64.     awk '{printf "\t%2d.\t%s %2d %s\t(%d bytes)\n", NR,$5,$6,$7,$4}' $TMP
  65.     echo ""
  66.     while :; do
  67.         echo -n "Enter number corresponding to the version you want [$ncopies] "
  68.         read ans
  69.         case "$ans" in
  70.         "")
  71.             version=$ncopies
  72.             break;;
  73.         n* | N*)
  74.             giveup;;
  75.         [0-9]*)
  76.             if [ $ans -gt 0 -a $ans -le $ncopies ]; then
  77.                 version=$ans
  78.                 break
  79.             fi;;
  80.         esac
  81.         echo "Answer must be a number from 1 to $ncopies, or <cr>."
  82.     done
  83.     set -- `sed -n ${version}p $TMP`
  84.     ;;
  85. *)
  86.     sorry;;
  87. esac
  88. if [ -f $filename ]; then
  89.     owner=`ls -l $filename | awk '{print $3}'`
  90.     if [ $owner != $USER ]; then
  91.         echo "$myname: you are not the owner of $filename"
  92.         exit 1
  93.     fi
  94.     echo -n "\"$filename\" exists, overwrite [y] ? "
  95.     read ans
  96.     case "$ans" in
  97.     "" | y* | Y* );;
  98.     *) giveup;;
  99.     esac
  100. fi
  101. echo -n "Retrieving $5 $6 $7 version of \"$filename\" ... "
  102. cp -p $backdir/$8 $filename || {
  103.     echo $myname: copy failed
  104.     exit 1
  105. }
  106. # Update the times, but keep the modes
  107. touch -f $filename || echo $myname: Can\'t touch \"$filename\"
  108. echo "done!"
  109. exit 0
  110.