How to check if a directory exists in a shell script
To check if a directory exists and is a directory use the following syntax:
[ -d "/path/to/dir" ] && echo "Directory /path/to/dir exits." || echo "Error: Directory /path/to/dir does not exits."
The following version also check for symbolic link:
[ -d "/path/to/dir" && ! -L "/path/to/dir" ] && echo "Directory /path/to/dir exits." || echo "Error: Directory /path/to/dir exits but point to $(readlink -f /path/to/dir)."
OR
[ -d "/path/to/dir" && ! -h "/path/to/dir" ] && echo "Directory /path/to/dir exits." || echo "Error: Directory /path/to/dir exits but point to $(readlink -f /path/to/dir)."
Finally, you can use the traditional if..else..fi:
if [ -d "/path/to/dir" ]
then
echo "Directory /path/to/dir exits."
else
echo "Error: Directory /path/to/dir does not exits."
fi
Shell script examples to see if a ${directory} exists or not
#!/bin/bash
dir="$1"
[ $# -eq 0 ] && { echo "Usage: $0 dir-name"; exit 1; }
if [ -d "$dir" -a ! -h "$dir" ]
then
echo "$dir found and setting up new Apache/Lighttpd/Nginx jail, please wait..."
# __WWWJailSetup "cyberciti.biz" "setup"
else
echo "Error: $dir not found or is symlink to $(readlink -f ${dir})."
fi
In this example, create directories if does not exits:
# Purpose: Setup jail and copy files
# Category : Core
# Override : No
# Parameter(s) : d => domain name
# action => setup or update
__WWWJailSetup(){
local d="$1"
local action="${2:setup}" # setup or update???
local index="$d
$d
" # default index.html
local J="$(_getJailRoot $d)/$d" # our sweet home
local _i=""
[ "$action" == "setup" ] && echo "* Init jail config at $J..." || echo "* Updating jail init config at $J..."
__init_domain_config "$d"
[ "$action" == "setup" ] && echo "* Setting up jail at $J..." || echo "* Updating jail at $J..."
[ ! -d "$J" ] && $_mkdir -p "$J"
for _i in $J/{etc,tmp,usr,var,home,dev,bin,lib64}
do
[ ! -d "$_i" ] && $_mkdir -p "$_i"
done
for _i in $_lighttpd_webalizer_base/$d/stats/{dump,out}
do
[ ! -d "$_i" ] && $_mkdir -p "$_i"
done
for _i in $_lighttpd_webalizer_prepost_base/$d/{pre.d,post.d}
do
[ ! -d "$_i" ] && $_mkdir -p "$_i"
done
## truncated
}
Summary
Use the following to check file/directory types and compare values:
- -L "FILE" : FILE exists and is a symbolic link (same as -h)
- -h "FILE" : FILE exists and is a symbolic link (same as -L)
- -d "FILE" : FILE exists and is a directory
- -w "FILE" : FILE exists and write permission is granted






