To check if a file does not exist in Bash, use the test
command ([ ]
) with the -f
(file) or -e
(file/directory) flag and the negation operator !
. Here’s how to do it:
Basic Syntax
if [ ! -f "$file" ]; then
echo "File $file does NOT exist"
fi
or for any file type (including directories/symlinks):
if [ ! -e "$file" ]; then
echo "File/directory $file does NOT exist"
fi
Key Options
Flag | Purpose |
---|---|
-f | Check if a regular file exists |
-e | Check if any file/directory exists |
! | Negate the condition (true if file missing) |
Examples
1. Check if a file is missing and act:
file="/path/to/your/file.txt"
if [ ! -f "$file" ]; then
echo "Error: $file not found. Creating it..."
touch "$file"
fi
2. Fail a script if a required file is missing:
config="config.yaml"
if [ ! -f "$config" ]; then
echo "Critical: $config missing. Exiting."
exit 1
fi
3. Check for multiple files:
if [ ! -f "$file1" ] && [ ! -f "$file2" ]; then
echo "Neither $file1 nor $file2 exists."
fi
Using [[ ]]
for Advanced Checks
The [[ ]]
construct (Bash-only) is safer for variables with spaces or special characters:
if [[ ! -f $file ]]; then # Quotes optional inside [[ ]]
echo "$file not found"
fi
Common Pitfalls
- Spacing: Ensure spaces inside
[ ]
or[[ ]]
:
[ ! -f "$file" ] # ✅ Correct
[! -f "$file" ] # ❌ Fails (no space after [)
- Quoting Variables: Always quote
"$file"
to handle filenames with spaces:
[ ! -f "$file" ] # ✅ Safe for "my file.txt"
[ ! -f $file ] # ❌ Breaks on spaces
- Symlinks: Use
-e
instead of-f
if checking for symlink existence.
Summary
- Use
[ ! -f "$file" ]
for regular files. - Use
[ ! -e "$file" ]
for any file/directory. - Prefer
[[ ]]
in Bash scripts for better readability and safety.