Check if File / Directory Exists
How to check if a File or Directory Exists in Bash
In Bash, you can use the test command to check whether a file exists and determine the type of the file.
The test command takes one of the following syntax forms:
If you want your script to be portable, you should prefer using the old test [
command, which is available on all POSIX shells. The new upgraded version of the test command [[
(double brackets) is supported on most modern systems using Bash, Zsh, and Ksh as a default shell.
Check if File Exists
When checking if a file exists, the most commonly used FILE operators are -e
and -f
. The first one will check whether a file exists regardless of the type, while the second one will return true only if the FILE is a regular file (not a directory or a device).
The most readable option when checking whether a file exists or not is to use the test
command in combination with the if
statement . Any of the snippets below will check whether the /etc/resolv.conf
file exists:
If you want to perform a different action based on whether the file exists or not simply use the if/then construct:
Always use double quotes to avoid issues when dealing with files containing whitespace in their names.
You can also use the test command without the if statement. The command after the &&
operator will only be executed if the exit status of the test command is true,
If you want to run a series of command after the &&
operator simply enclose the commands in curly brackets separated by ;
or &&
:
Opposite to &&
, the statement after the ||
operator will only be executed if the exit status of the test command is false
.
Check if Directory Exist
The operators -d
allows you to test whether a file is a directory or not.
For example to check whether the /etc/docker
directory exist you would use:
You can also use the double brackets [[
instead of a single one [
.
Check if File does Not Exist
Similar to many other languages, the test expression can be negated using the !
(exclamation mark) logical not operator:
Same as above:
Check if Multiple Files Exist
Instead of using complicated nested if/else constructs you can use -a
(or &&
with [[
) to test if multiple files exist:
Equivalent variants without using the IF statement:
File test operators
The test command includes the following FILE operators that allow you to test for particular types of files:
-b
FILE
- True if the FILE exists and is a special block file.-c
FILE
- True if the FILE exists and is a special character file.-d
FILE
- True if the FILE exists and is a directory.-e
FILE
- True if the FILE exists and is a file, regardless of type (node, directory, socket, etc.).-f
FILE
- True if the FILE exists and is a regular file (not a directory or device).-G
FILE
- True if the FILE exists and has the same group as the user running the command.-h
FILE
- True if the FILE exists and is a symbolic link.-g
FILE
- True if the FILE exists and has set-group-id (sgid
) flag set.-k
FILE
- True if the FILE exists and has a sticky bit flag set.-L
FILE
- True if the FILE exists and is a symbolic link.-O
FILE
- True if the FILE exists and is owned by the user running the command.-p
FILE
- True if the FILE exists and is a pipe.-r
FILE
- True if the FILE exists and is readable.-S
FILE
- True if the FILE exists and is a socket.-s
FILE
- True if the FILE exists and has nonzero size.-u
FILE
- True if the FILE exists, and set-user-id (suid
) flag is set.-w
FILE
- True if the FILE exists and is writable.-x
FILE
- True if the FILE exists and is executable.
Resources
Last updated