Questa è una cosa sorprendentemente complicata da fare bene.
Fondamentalmente, -d
metterà alla prova solo un singolo argomento, anche se potresti abbinare i nomi di file usando un'espressione regolare.
Un modo sarebbe quello di capovolgere il problema e testare le directory per una corrispondenza regex invece di testare la corrispondenza regex per le directory. In altre parole, passa in rassegna tutte le directory $HOME
usando un semplice shell glob, e testa ciascuna contro la tua regex, interrompendo una corrispondenza, e infine verificando se l' BASH_REMATCH
array non è vuoto:
#!/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
Un modo alternativo sarebbe quello di utilizzare un glob shell esteso al posto del regex e catturare qualsiasi corrispondenza glob in un array. Quindi verificare se l'array non è vuoto:
#!/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
Il trailing /
assicura che siano abbinate solo le directory; la nullglob
impedisce alla shell di ritorno stringa uguali nel caso di zero abbinamento.
Per rendere ricorsivo, impostare l' globstar
opzione di shell ( shopt -s globstar
) e quindi rispettivamente: -