How to Check if File or Directory Exists in Bash Shell

If you are working on a Bash script that interacts with files and directories, you might encounter a situation where you need to make sure that the file or directory exists. This helps avoiding possible errors for performing certain actions on a file that doesn’t exist.

In this tutorial, I’ll show you a couple of ways to check if file or directory exists in bash script or not. Let’s start with file first.

Check if file exists in bash script

The idea here is to use the -f operator that returns true only when it is a regular file (not directory).

Let’s say you want to check if file /home/user/my_file exists or not. Here’s how you can check with square brackets

#!/bin/bash
 
if [ -f /home/user/my_file ]
then
    echo "My file exists"
fi

But you won’t always get the file name before hand, will you? You can have it in a variable and if that’s the case, you can use it in this fashion.

#!/bin/bash

FILE=/home/user/my_file
 
if [ -f "$FILE" ]
then
    echo "My file exists"
else 
    echo "My file doesn't exist"
fi

Basically, what matters is the condition you use in the if command. It’s up to you how you want to use the if statement.

For example, you can write it with two square brackets, keep ‘then’ in the same line as ‘if’ with the help of semicolon like this:

#!/bin/bash

FILE=/home/user/my_file
 
if [ -f "$FILE" ]; then
    echo "My file exists"
else 
    echo "My file doesn't exist"
fi

or put the entire statement together like this:

[ -f /home/user/my_file ] && echo "My file exists" || echo "My file doesn't exist"

Check file exists in bash with test

You can also use test in bash to see if file exists or not. It’s pretty much the same thing only that you don’t use the square brackets in the if statement:

#!/bin/bash

FILE=/home/user/my_file
 
if test -f "$FILE" 
then
    echo "My file exists"
else 
    echo "My file doesn't exist"
fi

You can also use the above code in single line like this:

test -f /home/user/my_file && echo "My file exists" || echo "My file doesn't exist"

Check if file doesn’t exist in bash script

What if it’s the other way round and you want to check if file does not exist in bash? You can use pretty much the same code as above by using the negation operator:

#!/bin/bash

FILE=/home/user/my_file
 
if [ ! -f "$FILE" ]
then
    echo "My file doesn't exist"
fi

Now that you know how to deal with files, let’s move on to directories.

Check if directory exists in bash script

The code for checking directory is the same as the one you saw in the previous section. The only difference is that you’ll be using -d instead of -f. -d returns true only for directories.

#!/bin/bash
 
if [ -d /home/user/my_dir ]
then
    echo "My directory exists"
fi

You can also use test here:

#!/bin/bash

DIR=/home/user/my_dir
 
if test -d "$DIR" 
then
    echo "My directory exists"
else 
    echo "My directory doesn't exist"
fi

Check if directory doesn’t exist in bash

You can use the negation again to check if directory doesn’t exist:

#!/bin/bash

DIR=/home/user/my_dir
 
if [ ! -d "$DIR" ]
then
    echo "My directory doesn't exist"
fi

That’s it. That’s all you need to do for checking if a directory of file exists in bash shell or not.

I hope you find this bash tip useful. If you have any questions or suggestions, please feel free to leave a comment below.