page%swap@Sun.COM (Bob Page) (05/17/89)
Submitted-by: bmacintyre@watcgl.waterloo.edu (Blair MacIntyre)
Posting-number: Volume 89, Issue 139
Archive-name: dos/fs/rxbackup.1
backup.rexx behaves much like the Unix backup program, creating a
directory tree with a directory for each file and saving files by the
date they were changed.
The reason I am posting this is to allow others to have yet-another
sample Arexx program. Besides, I think it's useful!!
[unix has a 'backup' program? ..bob]
# This is a shell archive.
# Remove anything above and including the cut line.
# Then run the rest of the file through 'sh'.
# Unpacked files will be owned by you and have default permissions.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: SHell ARchive
# Run the following text through 'sh' to create:
# Readme
# backup.rexx
# This is archive 1 of a 1-part kit.
# This archive created: Wed May 17 20:01:54 1989
echo "extracting Readme"
sed 's/^X//' << \SHAR_EOF > Readme
XOk, so I finally got around to using ARexx, after watching the manual
Xcollect dust for 4 months. As I posted recently, I would have really
Xliked more examples ... it would have been easier. But it was
Xsurprisingly easy.
X
XSo, my first effort is a script called backup.rexx which is based on
Xarchie.rexx ( which I think I got off of comp.sources.amiga some
Xtime ago. )
X
XIt behaves much like the Unix backup program, creating a directory
Xtree with a directory for each file and saving files by the date
Xthey were changed.
X
Xie. backing up /d1/d2/file with a file stamp of 01 May 11:15 would give
X /d1/d2/file/01-May-11-15 in the backup directory
X
XThe source and destination directories are specified at execution time.
X
XThe reason I am posting this is to allow others to have yet-another
Xsample Arexx program. Besides, I think it's useful!!
X
XOne thing to note is that is corrects a problem in Archie.rexx, which
Xwouldn't work on files or directories with embedded spaces in the name.
XRead the comments to see how.
X
XAnother interesting point was that, for safety, I had to force quotation
Xof the "makedir" and "copy" parameters, because a file such as "blat5.1+"
Xneeds to be quoted, for example. I discovered that the hard way!
X
XNOTE: you need some form of ls (I'm using the Manx one) in your C:
Xdir for this to work!!!
X
X=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-///-=
X= Blair MacIntyre, bmacintyre@watcgl.{waterloo.edu, UWaterloo.ca} \\\/// =
X= now appearing at the Computer Graphics Lab, U of Waterloo! \XX/ =
X= "Don't be mean ... remember, no matter where you go, there you are." BBanzai=
X
X
SHAR_EOF
echo "extracting backup.rexx"
sed 's/^X//' << \SHAR_EOF > backup.rexx
X/*
X * Backup.rexx -- by Blair MacIntyre
X * a temporary backup utility based on
X * Archie.rexx -- a backup utility by <CB> aka Christian Balzer
X * which was based on du.rexx by Larry Phillips.
X *
X * Usage: [rx] backup SOURCE DESTINATION [-options]
X *
X * SOURCE and DESTINATION are valid AmigaDOS path's WITHOUT trailing
X * slashes '/'.
X * Valid options are: Currently none...
X *
X * Backup will copy all files that don't have the archive bit set
X * from SOURCE and it's subdirectories to DESTINATION, with the modification
X * that each file will now be a directory and will have files for each time
X * copied with the filename being the date.
X *
X * If these directories don't exist at DESTINATION, backup will try to create
X * them on the fly and thus preserving the original structure at SOURCE.
X * After the file has been copied, it's archive bit will be set.
X *
X * Note: The files will be copied with 'CLONE' flag of the COPY command
X * set. This of course only works with the 1.3 version of COPY.
X *
X * Unlike Archie, filenames or directories containing blanks
X * (like "My Dir:My File"), ARE supported!
X *
X * BIG NOTE: you need "ls" in your c: directory. I have tried this
X * with the manx ls, so I don't know about the PD one.
X *
X */
X
X/* This is Public Domain, read the source and learn - I did!!! */
X
Xsay 'Backup 2.4 (Based on Archie 1.6) (3-May-89)'
X
X/* open the Rexx support library */
X
Xif ~show('L',"rexxsupport.library") then
Xdo
X if addlib('rexxsupport.library',0,-30,0) then
X say 'added rexxsupport.library'
X else
X do
X say 'support library not available'
X exit 10
X end
Xend
X
Xaddress command
Xcall pragma 'priority',-1
X
Xarg rein
X
X/* The parser */
Xcopt = 'clone'
X
Xif words(rein) < 2 then
Xdo
X say 'Backup: give me a SOURCE *AND* a DESTINATION path'
X exit 10
Xend
X
Xroot = subword(rein,1,1)
Xdest = subword(rein,2,1)
X
Xif ~ exists(root) then
Xdo
X say 'Source not found'
X say 'Exiting... Check your parameters'
X exit 10
Xend
X
X/* enclose file parms for makedir ( and eventually, copy ) in "quotes" to
X handle spaces */
X
Xif ~ exists(dest) then
Xdo
X say 'Destination not found'
X newdest = """" || dest || """"
X say 'I''ll try to create it for you...'newdest
X 'makedir ' newdest
X if ~ exists(dest) then
X do
X say 'Exiting... Check your parameters'
X exit 15
X end
X say 'Created 'dest
Xend
X
Xif right(root,1) ~= ':' then
X root = root || '/'
Xif root = '/' then
X root = ''
X
Xif right(dest,1) ~= ':' then
X dest = dest || '/'
Xif dest = '/' then
X dest = ''
X
Xrlen = length(root)
X
Xbytes = 0
Xblocks = 0
Xfiles = 0
Xdircount = 1
X
Xsay 'Backup is doing it''s job on 'root
Xcall dolist root , 1
X
Xsay
Xsay 'Backed Up:' bytes 'bytes,' blocks 'blocks, ',
X files 'files in a total 'dircount' directories.'
Xexit 0
X
X/* The real thing
X *
X * x is the dir we are working on
X * depth is the recursion level, so we can have a unique pipe!
X */
X
Xdolist: procedure expose bytes blocks files dest rlen dircount copt
Xparse arg x, depth
X
Xsay 'working on directory' x
X
X/* I'm not using showdir() for the file list because I want the time
X stamps as well - can you say KLUDGE boys and girls?!? Good, I knew you
X could! */
X
Xpipefile = "pipe:backup_ls_" || depth
Xthedate = 'file' || depth
Xcall open thedate, pipefile, 'Read'
X'ls' ">"pipefile "-l" x
X
X/* the other reason for not using showdir() is that the filenames with spaces
X get split up and we can't tell which they are ... */
X
Xdo forever
X
X /* datestr contains the "ls -l" line for the current file */
X datestr = readln( thedate )
X
X /* if the number of words is less than 6, this is not a file line,
X which means it is the "No files found" line. However, I'm not making
X it dependent on that exact string */
X if words( datestr ) < 6 then
X leave
X
X /* apparantly the Manx version of ls doesn't print the summary line if
X a directory only has one subfile ... pftt! */
X if eof( thedate ) then
X leave
X
X /* the last line of an "ls -l" starts with a number */
X if datatype(word(datestr,1), 'Numeric') then
X leave
X
X /* I used to grad the 6th word as the file name, but that went TU on names
X with embedded spaces. Grab *ALL* after the 5th ... */
X temp = x || subword(datestr, 6)
X flen = length(subword(datestr, 6))
X type = statef(temp)
X
X /* create a subdir for all dirs AND files! */
X subdir = dest || right(temp,(length(temp) - rlen))
X if ~ exists(subdir) then
X do
X say ' *** Creating directory' subdir
X newsubdir = """" || subdir || """"
X 'makedir' newsubdir
X if ~ exists(subdir) then
X do
X say 'Oop Ack Pftt ... sorry ... Exiting'
X exit 20
X end
X end
X
X /* recursively do directories */
X
X if word(type,1) = 'DIR' then
X do
X call dolist temp || '/', depth + 1
X dircount = dircount + 1
X end
X
X /* files get dated files made of them! */
X if word(type,1) = 'FILE' then
X do
X if substr(word(type,4),4,1) = '-' then
X do
X
X datefile = word(datestr,3) || '-' || word(datestr,4) || '-' || overlay('-',word(datestr,5),'3')
X target = dest || right(temp,(length(temp) - rlen)) || '/' || datefile
X
X if ~ exists(target) then
X do
X newsrc = """" || temp || """"
X newtgt = """" || target || """"
X 'copy ' newsrc newtgt copt
X files = files + 1
X bytes = bytes + word(type,2)
X blocks = blocks + word(type,3) + 1
X say 'Backed up file 'temp' as 'datefile
X end
X end
X end
Xend
X
Xcall close thedate
X
Xreturn
SHAR_EOF
echo "End of archive 1 (of 1)"
# if you want to concatenate archives, remove anything after this line
exit