check if multiple directories exist else create missing directories

Hi ,
I 'm trying to check if multiple directories exist on a server, if not create the missing ones and print " creating missing directory.
how to write this in a simple script, I have made my code complex

if [ -d "${schemaExtractDir}/SchemaExtract" ]; then
 taskStatus="Schema extract directory exists, checking if SQL,Count and SchExtArchive directories exist."
 print -r "$taskStatus"
 if [ -d "${schemaExtractDir}/SQL" ]; then
  taskStatus="${schemaExtractDir}/SQL directory exists, checking if Count and SchExtArchive directories exists."
  print -r "$taskStatus"
  if [ -d "${schemaExtractDir}/Count" ]; then
   taskStatus="${schemaExtractDir}/Count directory exists, checking if SchExtArchive directory exists."
   print -r "$taskStatus"
   if [ -d "${schemaExtractDir}/SchExtArchive" ]; then
    taskStatus="${schemaExtractDir}/SchExtArchive directory exists."
    print -r "$taskStatus"
   else
    taskStatus="${schemaExtractDir}/SchExtArchive directory does not exist, creating ${schemaExtractDir}/SchExtArchive directory"
    print -r "$taskStatus"
    mkdir -p ${schemaExtractDir}/SchExtArchive 2>/dev/null
   fi
  else
   taskStatus="${schemaExtractDir}/Count directory does not exist, creating ${schemaExtractDir}/Count directory"
   print -r "$taskStatus"
   mkdir -p ${schemaExtractDir}/Count 2>/dev/null
  fi
 else
  taskStatus="${schemaExtractDir}/SQL directory does not exist, creating ${schemaExtractDir}/SQL directory."
  print -r "$taskStatus"
  mkdir -p ${schemaExtractDir}/SQL 2>/dev/null
   taskStatus="Checking if ${schemaExtractDir}/NPICount directory exists."
   print -r "$taskStatus"
    if [ -d "${schemaExtractDir}/Count" ]; then
       taskStatus="${schemaExtractDir}/Count directory exists."
       print "$taskStatus"
    else
       taskStatus="${schemaExtractDir}/Count directory does not exist, creating ${schemaExtractDir}/Count directory"
       print "$taskStatus"
       mkdir -p ${schemaExtractDir}/Count 2>/dev/null
    fi
 fi
else
 taskStatus="Schema extract directory does not exist, creating schema extract,SQL,Count and SchExtArchive directories."
 print -r "${taskStatus}"
 mkdir -p ${schemaExtractDir} 2>/dev/null
 mkdir -p ${schemaExtractDir}/SchemaExtract 2>/dev/null
 mkdir -p ${schemaExtractDir}/SQL 2>/dev/null
 mkdir -p ${schemaExtractDir}/Count 2>/dev/null 
 mkdir -p ${schemaExtractDir}/SchExtArchive 2>/dev/null
fi
chmod 755 ${schemaExtractDir}/SchemaExtract
chmod 755 ${schemaExtractDir}/SQL
chmod 755 ${schemaExtractDir}/Count
chmod 755 ${schemaExtractDir}/SchExtArchive

I want to acheive the above in few steps... not this many if else loops...
how to do it?

thanks
ram

Sounds like you need to do some reading up on select statements ( Bourne/bash shell scripts: case statement | Bourne shell scripting | Tech-Recipes )

eg

case "$var" in
value1)
commands;
;;
value2)
commands;
;;
*)
commands;
;;
esac

and for loops.

for ((  i = <start number> ;  i < <finish number>;  i++  ))
do
<commands>
done

So basically you're code will look like this:

for ((  i = 1 ;  i < 4;  i++  ))
do
	case "$i" in
		'1') dirname="<dir path 1>"
		;;
		'2') dirname="<dir path 2>"
		;;
		'3') dirname="<dir path 3>"
		;;
	esac

	<enter the code for just the one directory here>
done

Basically, where the 1st 4 appears in the 1st line above, change that for the max number off directories you need to check for.

change <dir path 1> to the 1st directory path.
change <dir path 2> to the 2nd directory path....etc

and <enter the code for just the one directory here> put the actual code you were repeating countless times (but only 1 reitteration).
Each time you need to feed in the directory path, use $dirpath instead.
eg

if [ -d "$dirpath" ]; then

That's the basic theory anyway. I'm half asleep (as it's after midnight in the UK) and coding this directly into Chromium, so you'll have to do the debugging.

Good luck:b:

Thanks for the reply.
I'm confused with your approach, can you explain it at your convenience.

say my schemaExtractDir="/var/tmp"
I'm checking for multiple directories under it
"$schemaExtractDir/SchemaExtract"
"$schemaExtractDir/SQL"
"$schemaExtractDir/Count"
"$schemaExtractDir/SchExtArchive"

if [ -d "$schemaExtractDir/SchemaExtract" ]; then
print "SchemaExtract directory exists"
else
mkdir -p "$schemaExtractDir/SchemaExtract" 2>/dev/null
chmod 755 "$schemaExtractDir/SchemaExtract"
fi

If any of these directories are missing; then I need to create the missing directory and print a message to stdout,"creating missing directory "/var/tmp/Count".

Can I check for multiple directories within the red part , if so how do i do it

basically to check multiple directories, then you have to put your script inside a loop (so it runs the script several times - each time running it against a different directory)

The loop needs two parts to it:
1/ the loop itself (using for command)
2/ the directory name selector (using case to select which directory name to pass to your script per iteration of the loop)

I've probably still explained this very badly.:frowning:

To keep the forums high quality for all users, please take the time to format your posts correctly.

  1. Use Code Tags when you post any code or data samples so others can easily read your code.
    You can easily do this by highlighting your code and then clicking on the # in the editing menu. (You can also type code tags and by hand.)
  2. Avoid adding color or different fonts and font size to your posts.
    Selective use of color to highlight a single word or phrase can be useful at times, but using color, in general, makes the forums harder to read, especially bright colors like red.
  3. Be careful when you cut-and-paste, edit any odd characters and make sure all links are working property.

Thank You.

The UNIX and Linux Forums
Reply With Quote

Is it OK for you to keep the directories to check in a file, so you check (in)existing directories against the file?

#!/bin/sh

schemaExtractDir="/var/tmp"
while read dir; do
  dir="$schemaExtractDir/$dir"
  if [ -d "$dir" ]; then
    echo "$dir exists, not creating this dir."
  else
    echo "$dir does not exist: creating one for you..."
    mkdir "$dir"
  fi
done < file

exit 0

file is a text file containing directories to create.

~$ cat file
SchemaExtract
SQL
Count
SchExtArchive

~$ ./script.sh
/var/tmp/SchemaExtract does not exist: creating one for you...
/var/tmp/SQL does not exist: creating one for you...
/var/tmp/Count exists, not creating this dir.
/var/tmp/SchExtArchive does not exist: creating one for you...

Nicely done

 
#!bin/ksh
DIRLOC=/var/tmp
DIRNAMES="SchemaExtract SQL Count SchExtArchive"
for DIRNAME in ${DIRNAMES}
do
if [ -d ${DIRLOC}/${DIRNAME} ]
then
        echo ${DIRLOC}/${DIRNAME} already exists
else
        echo ${DIRLOC}/${DIRNAME} Creating ...
        mkdir ${DIRLOC}/${DIRNAME}
        chmod 755 ${DIRLOC}/${DIRNAME}
fi
done