Last updated on February 9, 2021 by Dan Nanni
When you are working on a shell script in
bash, there are cases where you want to check if a particular file exists (or does not exist) in a directory, and then perform an action based on the condition. In
bash, there are several ways to check whether or not a file exists in
bash. In the following I demonstrate several
bash shell script examples for this use case.
The easiest way to check if a file exists is to use the
test command. With
-f <file-name> option, the
test command returns true if the specified file exists.
FILE=/etc/pam.conf if test -f $FILE; then echo "$FILE exists" fi
Alternatively, you can use the
bash's built-in flag
-f, which can check for existence of a file when used inside
bash's conditional expressions.
FILE=/etc/pam.conf if [ -f $FILE ]; then echo "$FILE does not exists" fi
It is also possible to use the following shorthand one-liner, where the conditional check and a corresponding action are written in a single line.
test -f $FILE && echo "$FILE exists."
[ -f $FILE ] && echo "$FILE exists."
If you want to check if a file does not exist in
bash, you can simply add
! in the above conditional expressions.
FILE=/etc/xmodulo.com # Option 1 if ! test -f $FILE; then echo "$FILE does not exist" fi # Option 2 if [ ! -f $FILE ]; then echo "$FILE does not exist" fi # Option 3 test ! -f $FILE && echo "$FILE does not exist." # Option 4 [ ! -f $FILE ] && echo "$FILE does not exist."
In all previous
bash script examples, the name of the file to check is pre-determined and known. What if you want to check if any file with a pattern (e.g., with a particular extension) exists? In that case, the name of file(s) to check for is not known. Note that the
test command and the
-f flag do not work with wildcard patterns.
The easiest way to check if any file with a wildcard expression exists is to use
ls command. You simply check if
ls (with a pattern) returns non-zero.
PATTERN="/etc/systemd/*.conf" if ls $PATTERN 1> /dev/null 2>&1; then echo "Files exist" fi
Another method is to use the
compgen command. You can use the
-G option to specify a glob pattern. Simlar to
compgen returns a list of files that are matched.
PATTERN="/etc/systemd/*.conf" if compgen -G $PATTERN > /dev/null; then echo "Files exist" fi
The following shorthand one-liners are also possible.
ls $PATTERN 1> /dev/null 2>&1 && echo "Files exist"
compgen -G $PATTERN > /dev/null && echo "Files exist"
bashshell scripting tutorials provided by Xmodulo.
Please note that this article is published by Xmodulo.com under a Creative Commons Attribution-ShareAlike 3.0 Unported License. If you would like to use the whole or any part of this article, you need to cite this web page at Xmodulo.com as the original source.