Если я хочу проверить на существование единственного файла, я могу протестировать на него использование test -e filename
или [ -e filename ]
.
Предположим, у меня есть шарик, и я хочу знать, существуют ли какие-либо файлы, чьи имена соответствуют шарику. Шарик может соответствовать 0 файлам (в этом случае, я ничего не должен делать), или он может соответствовать 1 или более файлам (в этом случае, я должен сделать что-то). Как я могу протестировать, имеет ли шарик какие-либо соответствия? (Я не забочусь, сколько там соответствия, и было бы лучше, если я мог бы сделать это с одним if
оператор и никакие циклы (просто, потому что я нахожу что самый читаемый).
(test -e glob*
сбои, если шарик соответствует больше чем одному файлу.)
if ls -d $glob > /dev/null 2>&1; then
echo Found.
else
echo Not found.
fi
Обратите внимание, что это может занять очень много времени, если есть много совпадений или доступ к файлам медленный.
#!/usr/bin/env bash
# If it is set, then an unmatched glob is swept away entirely --
# replaced with a set of zero words --
# instead of remaining in place as a single word.
shopt -s nullglob
M=(*px)
if [ "${#M[*]}" -ge 1 ]; then
echo "${#M[*]} matches."
else
echo "No such files."
fi
Чтобы несколько упростить ответ MYYN, основываясь на его идее:
M=(*py)
if [ -e ${M[0]} ]; then
echo Found
else
echo Not Found
fi
#!/bin/bash
set nullglob
touch /tmp/foo1 /tmp/foo2 /tmp/foo3
FOUND=0
for FILE in /tmp/foo*
do
FOUND=$((${FOUND} + 1))
done
if [ ${FOUND} -gt 0 ]; then
echo "I found ${FOUND} matches"
else
echo "No matches found"
fi
(ls glob* &>/dev/null && echo Files found) || echo No file found
Похоже, эта мерзость работает:
#!/usr/bin/env bash
shopt -s nullglob
if [ "`echo *py`" != "" ]; then
echo "Glob matched"
else
echo "Glob did not match"
fi
Вероятно, требуется bash, а не sh.
Это работает, потому что опция nullglob приводит к тому, что glob оценивается как пустая строка, если совпадений нет. Таким образом, любой непустой вывод команды echo указывает на то, что глобус чему-то соответствует.