How can I check if a directory exists in a Bash shell script?

ID : 96

viewed : 199

Tags : bashshellunixposixbash

Top 5 Answer for How can I check if a directory exists in a Bash shell script?

vote vote

98

To check if a directory exists in a shell script, you can use the following:

if [ -d "$DIRECTORY" ]; then   # Control will enter here if $DIRECTORY exists. fi 

Or to check if a directory doesn't exist:

if [ ! -d "$DIRECTORY" ]; then   # Control will enter here if $DIRECTORY doesn't exist. fi 

However, as Jon Ericson points out, subsequent commands may not work as intended if you do not take into account that a symbolic link to a directory will also pass this check. E.g. running this:

ln -s "$ACTUAL_DIR" "$SYMLINK" if [ -d "$SYMLINK" ]; then    rmdir "$SYMLINK"  fi 

Will produce the error message:

rmdir: failed to remove `symlink': Not a directory 

So symbolic links may have to be treated differently, if subsequent commands expect directories:

if [ -d "$LINK_OR_DIR" ]; then    if [ -L "$LINK_OR_DIR" ]; then     # It is a symlink!     # Symbolic link specific commands go here.     rm "$LINK_OR_DIR"   else     # It's a directory!     # Directory command goes here.     rmdir "$LINK_OR_DIR"   fi fi 

Take particular note of the double-quotes used to wrap the variables. The reason for this is explained by 8jean in another answer.

If the variables contain spaces or other unusual characters it will probably cause the script to fail.

vote vote

89

Remember to always wrap variables in double quotes when referencing them in a Bash script. Kids these days grow up with the idea that they can have spaces and lots of other funny characters in their directory names. (Spaces! Back in my days, we didn't have no fancy spaces! ;))

One day, one of those kids will run your script with $DIRECTORY set to "My M0viez" and your script will blow up. You don't want that. So use this.

if [ -d "$DIRECTORY" ]; then     # Will enter here if $DIRECTORY exists, even if it contains spaces fi 
vote vote

78

Note the -d test can produce some surprising results:

$ ln -s tmp/ t $ if [ -d t ]; then rmdir t; fi rmdir: directory "t": Path component not a directory 

File under: "When is a directory not a directory?" The answer: "When it's a symlink to a directory." A slightly more thorough test:

if [ -d t ]; then     if [ -L t ]; then        rm t    else        rmdir t    fi fi 

You can find more information in the Bash manual on Bash conditional expressions and the [ builtin command and the [[ compound commmand.

vote vote

60

I find the double-bracket version of test makes writing logic tests more natural:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then     echo "It's a bona-fide directory" fi 
vote vote

55

Shorter form:

# if $DIR is a directory, then print yes [ -d "$DIR" ] && echo "Yes" 

Top 3 video Explaining How can I check if a directory exists in a Bash shell script?

Related QUESTION?