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
-einstead of-fif 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.