Questa è una cosa sorprendentemente complicata da fare bene.
Fondamentalmente, -dmetterà 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 $HOMEusando un semplice shell glob, e testa ciascuna contro la tua regex, interrompendo una corrispondenza, e infine verificando se l' BASH_REMATCHarray 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 nullglobimpedisce alla shell di ritorno stringa uguali nel caso di zero abbinamento.
Per rendere ricorsivo, impostare l' globstaropzione di shell ( shopt -s globstar) e quindi rispettivamente: -