Это удивительно сложно сделать красиво.
По сути, -d
будет проверять только один аргумент - даже если вы можете сопоставить имена файлов с помощью регулярного выражения.
Одним из способов было бы перевернуть проблему и проверить каталоги на соответствие регулярному выражению вместо проверки соответствия регулярного выражения на наличие каталогов. Другими словами, переберите все каталоги, $HOME
используя простой глобус оболочки, и проверьте каждый на соответствие вашему регулярному выражению, разбив совпадение и, наконец, BASH_REMATCH
проверив, не является ли массив непустым:
#!/bin/bash
for d in "$HOME"/*/; do
if [[ $d =~ (ana|mini)conda[0-9]? ]]; then
break;
fi
done
if ((${#BASH_REMATCH[@]} > 0)); then
echo "anaconda/miniconda directory is found in your $HOME"
else
echo "anaconda/miniconda is not found in your $HOME"
fi
Альтернативным способом было бы использовать расширенный глобус оболочки вместо регулярного выражения и записывать любые совпадения глобуса в массиве. Затем проверьте, не является ли массив непустым:
#!/bin/bash
shopt -s extglob nullglob
dirs=( "$HOME"/@(ana|mini)conda?([0-9])/ )
if (( ${#dirs[@]} > 0 )); then
echo "anaconda/miniconda directory is found in your $HOME"
else
echo "anaconda/miniconda is not found in your $HOME"
fi
Трейлинг /
гарантирует, что сопоставляются только каталоги; nullglob
предотвращает скорлупу от возвращения непревзойденной строки в случае нулевых матчей.
Чтобы сделать либо рекурсивный, установите параметр globstar
оболочки ( shopt -s globstar
), а затем соответственно: -