Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/5/84; site cxsea.UUCP Path: utzoo!watmath!clyde!cbosgd!cbdkc1!desoto!packard!hoxna!houxm!vax135!cornell!uw-beaver!fluke!ssc-vax!cxsea!blm From: blm@cxsea.UUCP (Brian Matthews) Newsgroups: net.sources Subject: "nmkdir" in the Bourne shell at a Unix machine near you. Message-ID: <309@cxsea.UUCP> Date: Mon, 26-Aug-85 16:30:37 EDT Article-I.D.: cxsea.309 Posted: Mon Aug 26 16:30:37 1985 Date-Received: Wed, 28-Aug-85 09:32:24 EDT References: <1052@sdcsvax.UUCP> Organization: Computer X Inc., Seattle, Washington. Lines: 73 > ** If you want it, it's yours. All I ask in return is that if you > ** figure out how to do this in a Bourne Shell script you send me > ** a copy. Here 'tis. It basically uses expr to hack apart the requested path, and do mkdir's on all the intermediate components. I wrote it a while ago, but haven't used it much, but I do think it works well. There are three known problems: 1. It's slow. 2. It doesn't trap any signals, so you can hit delete and have half of a path made. This doesn't hurt anything, you may just have to do a little cleaning up. 3. It's slow. From the looks of the C source, it fixes all of the problems, so I may switch to it and toss this. I called it md, for Make Directory, kind of like Change Directory. #!/bin/sh # # md directories - make all components in a given path # # written by Brian L. Matthews, 17-Jul-84 # # md makes a directory path. Unlike mkdir, it makes all necessary # components of the path. It uses mkdir, so it should fail and succeed in # the same ways as mkdir. # md tends to be slow, and should be recoded in C someday. Oh well... # if [ $# = 0 ] # check for no arguments. If none, then # print same stuff and use same echo "$0: arg count" # exit status as mkdir exit 2 fi while [ -n "$1" ] # Loop through all arguments by # looking at the first and shifting # when done with it. do made= # $made tracks the components made # so far need=$1 # $need tracks what's left to make if [ `expr $need : '/.*'` = 0 ] # if $need doesn't start with a slash, then # add a slash, and say we've made made=`pwd` # the current working directory. need=/$need fi while [ -n "$need" ] # keep going until we've got it all do made=$made`expr $need : '\(.[^/]*\)/*'` # add the first component of $need to # $made. If $made was /u and $need # was /blm, $made would become # /u/blm if [ ! -d "$made" -o ! -w "$made" ] then # if $made isn't a directory or it's mkdir $made # not writable (i.e. it doesn't if [ $? != 0 ] # exist), do a mkdir. If the mkdir then # fails, exit with it's exit code. exit $? # mkdir has already printed the error. fi fi need=`expr $need : '.[^/]*\(/*.*\)'` # remove the first component of $need. done # we've now made a path, so scoot the shift # arguments down, and do the next one. done exit 0 Brian L. Matthews ...uw-beaver!ssc-vax!cxsea!cxsea2!arrakis!blm