Чарльз Плесси написал программу на Haskell, которая анализирует шаблоны установщика Debian -и создает одну HTML-страницу с заголовками вопросов, текстами, типами ответов и значениями по умолчанию. Эта страница чрезвычайно полезна при создании файлов preseed. Подробности в этом обсуждении .
Основываясь на этом ответе , мы можем использовать shopt -s nullglob
, чтобы убедиться, что уведомление возвращается, если каталог пуст:
[[ -n "$(shopt -s nullglob; echo foo*)" ]] && echo 'found it!' || echo 'nope!';
Далее предполагается, что вас не волнует, соответствует ли глобус каким-либо файлам, включая специальные файлы блоков, специальные файлы символов, каталоги, символические ссылки и т. д.
Это идеальный вариант использования дляfailglob
:
shopt -s failglob
if echo foo* &>/dev/null
then
# files found
else
# no files found
fi
Или, если вам нужен список файлов, если они существуют:
shopt -s failglob
files=(foo*)
if [[ "${#files[@]}" -eq 0 ]]
then
# no files found
else
# files found
fi
Если файлы не найдены, это ошибка, вы можете упростить это:
set -o errexit
shopt -s failglob
files=(foo*)
# We know that the expansion succeeded if we reach this line
Это может быть (редкостью! )законное использование ls
в скрипте:
if ls foo* &>/dev/null
then
…
else
…
fi
В качестве альтернативы, find foo* -maxdepth 0 -printf ''
.
Для полноты картины приведем несколько примеров использованияfind
:
#!/bin/bash
term=$1
if find -maxdepth 1 -type f -name "$term*" -print -quit | grep -q.; then
echo "found"
else
echo "not found"
fi
if [ -n "$(find -maxdepth 1 -type f -name "$term*" -print -quit)" ]; then
echo "found"
else
echo "not found"
fi
И несколько тестов:
user@host > find -type f
./foobar
./bar/foo
./bar/bar
./find_prefixed_files.sh
./ba
user@host >./find_prefixed_files.sh foo
found
found
user@host >./find_prefixed_files.sh bar
not found
not found