whitfill@hc.DSPO.GOV (Jim Whitfill) (02/29/88)
The following is a program (recursive in DCL) and an associated sub- program that will recursively delete directories and subdirectories, including the root directory. $ save_verify := 'f$verify(0) $ set message/notext/noid/noseverity/nofacility $ ! SYS$UTILS:[COMMANDS]DELTREE.COM $ ! $ ! This command file (used recursively) will delete the contents of a root $ ! directory, including the root directory and all subdirectories and files. $ ! $ ! $ ! P1 = device:[directory] location of root directory $ ! P2 = special delete switches, i.e. /BEFORE=YESTERDAY $ ! $ set noon $ batch = "NO" $ if f$mode() .nes. "INTERACTIVE" then batch = "YES" $ start_directory = f$logical("sys$disk") + f$directory() $ wo := write sys$output $ root = p1 $ if p1 .nes. "" then goto have_root $ get_root: $ if batch then wo "Directory not given in batch mode" $ if batch then goto delete_done $ inquire root "Enter DEVICE:[ROOT]" $ if root .eqs. "" then goto delete_done $ have_root: $ colon = f$locate(":",root) $ if colon .ne. f$length(root) then goto get_dir $ wo "You must enter a DEVICE:" $ goto get_root $ get_dir: $ device = f$extract(0,colon,root) $ deldir = f$extract(colon+2,f$length(root)-colon-3,root) $ define/user sys$output nl: $ define/user sys$error nl: $ directory 'root' $ if $status .eq. %X00000001 .or. $status .eq. %X10018290 - then goto root_ok $ wo "No such directory path ''root'" $ if batch then goto delete_done $ goto get_root $ root_ok: $ if batch then goto dont_check $ wo "" $ wo " !!! NODE ''f$logical("node")' !!!" $ wo "" $ wo "DELETE root dir, all subdirs and all files of ''root'" $ inquire really "Are You SURE? [NO]" $ if .not. really then goto delete_done $ dont_check: $ set def 'root' $ ! $ ! Invoke recursive procedure to delete the directory tree $ ! subject to any selection criteria in P2. $ ! $ @sys$utils:[commands]deldirsub "''p2'" $ ! $ ! Now get rid of top level directory $ ! $ if f$locate(".",root) .ne. f$length(root) then goto sub_delete $ set prot=sy:rwed 'device':[000000]'deldir'.dir;1 $ delete'p2' 'device':[000000]'deldir'.dir;1 $ if p2 .nes. "" then - wo "''device':[000000]''deldir'.dir;1 deleted, if created ''p2'" $ if p2 .eqs. "" then - wo "''device':[000000]''deldir'.dir;1 deleted" $ goto delete_done $ sub_delete: $ set default [-] $ parent = f$directory() $ parent = parent - "[" - "]" $ deldir = deldir - parent - "." $ set prot=sy:rwed 'device':'deldir'.dir;1 $ delete'p2' 'device':'deldir'.dir;1 $ dot = f$locate(".",root) $ root = f$extract(0,dot,root) + "]" $ if p2 .nes. "" then - wo "''root'''deldir'.dir;1 deleted, if created ''p2'" $ if p2 .eqs. "" then - wo "''root'''deldir'.dir;1 deleted" $ delete_done: $ set message/facility/text/severity/id $ set def 'start_directory' $ reset = f$verify(save_verify) $ ! SYS$UTILS:[COMMANDS]DELDIRSUB.COM $ ! $ ! This command file will recursively delete files in a dir tree $ ! starting at the current directory. $ set noon $ ! $ dirtodelete = f$directory() $ ! $ ! See if subdirectories exist and if so, go delete them. $ ! $ sub_loop: $ subdir = f$search("*.DIR;1") if subdir .eqs. "" then goto do_one subname = f$parse(subdir,,,"NAME") subdirect = dirtodelete - "]" + "." + subname + "]" set def 'subdirect' @sys$utils:[commands]deldirsub "''p1'" set def [-] goto sub_loop $ do_one: $ ! $ ! Delete all files subject to P1 qualifier (P2 may be null) $ ! $ set proc/priv=bypass $ delete'p1' *.*;* $ set proc/priv=nobypass $ write sys$output "All files deleted in ''dirtodelete' ''p1'" $ exit ======================================= Jim A. Whitfill Los Alamos National Laboratory (LANL) Group MEE-10, MS J580 Los Alamos, NM 87545 (505) 667-9282 (ARPAnet ==> whitfill%meediv.xnet@lanl.gov) =======================================