Search code examples
bashshellunixcommandposix

How do I check if a directory exists or not in a Bash shell script?


What command checks if a directory exists or not within a Bash shell script?


Solution

  • To check if a directory exists:

    if [ -d "$DIRECTORY" ]; then
      echo "$DIRECTORY does exist."
    fi
    

    To check if a directory does not exist:

    if [ ! -d "$DIRECTORY" ]; then
      echo "$DIRECTORY does not 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.