Update.csh



#           Compare and update a backup directory.
#
#  Usage:   update [-acd] frompath topath
#
#     Compare the frompath and topath directories looking for differences,
#     updating the topath directory as needed to make it an up-to-date
#     copy.
#
#     Comparison is done based on timestamps, not contents for speed.  By
#     default, only files that already exist in the 'topath' are updated.
#     Files that exist only in the 'frompath' are not copied.  (This is
#     done on the assumption that the 'topath' is intended only to contain
#     a snapshot of the important files.)
#
#     By default, an extra files in the 'topath' are not deleted.
#
#  Options:
#
#     -a    All files.  If a file or subdirectory exists only in the
#           frompath, copy it to the topath.
#     -c    Compare only and report.
#     -d    Delete any extra files in the topath.
#     -v    Verbose.


proc update(args)
   local j, frompath, topath, allfiles, compareonly, deleteextra, Verbose

   if ($#args < 2) then
      echo "Usage:  update [-acdv] frompath topath"
      @ status = 1
      return
   end

   while ($#args >= 3)
      if (substr(args[0], 1, 1) != '-') then
         echo "Usage:  update [-acd] frompath topath"
         @ status = 1
         return
      end
      for j = 2 to strlen(args[0]) do
         switch (substr(args[0], j, 1))
            case 'a':
               @ allfiles = 1
               break
            case 'c':
               @ compareonly = 1
               break
            case 'd':
               @ deleteextra = 1
               break
            case 'v':
               @ Verbose = 1
               break
            case '-':
               break
            default:
               echo "Usage:  update [-acd] frompath topath"
               @ status = 1
               return
         end
      end
   shift args
   end

   @ frompath = fullpath(args[0])
   @ topath = fullpath(args[1])
   if (frompath =~ "*\") @ frompath = substr(frompath, 1, strlen(frompath) - 1)
   if (topath =~ "*\") @ topath = substr(topath, 1, strlen(topath) - 1)

   if (Verbose) echo Comparing $frompath and $topath

   if (-e $frompath && -e $topath && $#frompath == 1 && $#topath == 1) then
      if (Verbose) echo Paths exist, now comparing
      if (-D $frompath) then
         if (! -D $topath) then
            echo $topath must be a directory
            @ status = 1
            return
         end
         if (!allfiles) then
            foreach j (`ls -1rD $frompath`)
               if (-e $topath\$j && `newer $frompath\$j $topath\$j`) then
                  if (compareonly) then
                     echo $topath\$j is out of date
                  else
                     if (Verbose) echo Updating $topath\$j
                     cp $frompath\$j $topath\$j
                  end
               end
            end
         else
            foreach j (`ls -1ra +D -. $frompath`)
               if (!-e $topath\$j) then
                  if (compareonly) then
                     echo $topath\$j does not exist
                  else
                     if (Verbose) echo Creating $topath\$j
                     mkdir $topath\$j
                  end
               end
            end
            foreach j (`ls -1rD $frompath`)
               if (-e $topath\$j) then
                  if (`newer $frompath\$j $topath\$j`) then
                     if (compareonly) then
                        echo $topath\$j is out of date
                     else
                        if (Verbose) echo Updating $topath\$j
                        cp $frompath\$j $topath\$j
                     end
                  end
               else
                  if (compareonly) then
                     echo $topath\$j does not exist
                  else
                     if (Verbose) echo Creating $topath\$j
                     cp $frompath\$j $topath\$j
                  end
               end
            end
         end
         if (deleteextra) then
            if (compareonly) then
               foreach j (`ls -1rD $topath`)
                  if (!-e $frompath\$j) then
                     echo $frompath\$j does not exist
                  end
               end
            else
               foreach j (`ls -1rD $topath`)
                  if (!-e $frompath\$j) then
                     if (Verbose) echo Deleting $topath\$j
                     rm $topath\$j
                  end
               end
            end
         end
      else
         if (-D $topath) then
            echo $topath must be an ordinary file
            @ status = 1
            return
         end
         if (compareonly) then
            echo $topath is out of date
         else
            if (Verbose) echo Updating $topath
            cp $frompath $topath
         end
      end
   else
      echo Either $frompath or $topath is not a valid pathname
   end
end

update $argv



Hamilton C shell | Free Updates | Free Demo Software | Win32 Training
Y2K | Customer Testimonials | On-line Hamilton C shell User Guide
Home | Email | Support | Company Profile | Distributors | Links



Copyright © 1997-2001 by Hamilton Laboratories. All rights reserved.
You are visitor number 237. This page was last modified November 3, 2001.