C'est une chose étonnamment délicate à faire correctement.
Fondamentalement, -d
ne testera qu'un seul argument - même si vous pouvez faire correspondre les noms de fichiers en utilisant une expression régulière.
Une façon serait de retourner le problème et de tester les répertoires pour une correspondance regex au lieu de tester la correspondance regex pour les répertoires. En d'autres termes, parcourez tous les répertoires en $HOME
utilisant un simple glob de shell, et testez chacun contre votre regex, rompant une correspondance, testant enfin si le BASH_REMATCH
tableau n'est pas vide:
#!/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
Une autre façon serait d'utiliser un glob shell étendu à la place de l'expression régulière, et de capturer toutes les correspondances glob dans un tableau. Testez ensuite si le tableau n'est pas vide:
#!/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
La fin /
garantit que seuls les répertoires correspondent; le nullglob
empêche le shell de renvoyer la chaîne sans correspondance dans le cas de correspondances nulles.
Pour rendre l'un ou l'autre récursif, définissez l' globstar
option shell ( shopt -s globstar
), puis respectivement: -