-e
doesn't work with globs. Use a for loop.if [ -e dir/*.mp3 ]
then
echo "There are mp3 files."
fifor file in dir/*.mp3
do
if [ -e "$file" ]
then
echo "There are mp3 files"
break
fi
done[ -e file* ] only works if there's 0 or 1 matches. If
there are multiple, it becomes [ -e file1 file2 ], and the
test fails.
[[ -e file* ]] doesn't work at all.
Instead, use a for loop to expand the glob and check each result individually.
If you are looking for the existence of a directory, do:
for f in /path/to/your/files*; do
## Check if the glob gets expanded to existing files.
## If not, f here will be exactly the pattern above
## and the exists test will evaluate to false.
[ -e "$f" ] && echo "files do exist" || echo "files do not exist"
## This is all we needed to know, so we can break after the first iteration
break
doneIf you are sure there will only ever be exactly 0 or 1 matches -- and
nullglob is not enabled -- then the test happens to
work.
You may still want to consider making this assumption explicit and failing fast if it's ever violated:
files=( dir/file* )
[ "${#files[@]}" -ge 2 ] && exit 1
if [ -e "${files[0]}" ]
then
echo "The file exists"
else
echo "No such file"
fiShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.