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.
Always wrap variables in double quotes when referencing them in a Bash script.
if [ -d "$DIRECTORY" ]; then # Will enter here if $DIRECTORY exists, even if it contains spaces fi
Kids these days put spaces and lots of other funny characters in their directory names. (Spaces! Back in my day, 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 double quotes.
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