Це напрочуд хитра справа зробити красиво.
По суті, -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), а потім відповідно: -