Esto es algo sorprendentemente complicado de hacer bien.
Básicamente, -dsolo probará un único argumento, incluso si puede hacer coincidir los nombres de archivo con una expresión regular.
Una forma sería darle la vuelta al problema y probar directorios para una coincidencia de expresiones regulares en lugar de probar la coincidencia de expresiones regulares para directorios. En otras palabras, recorra todos los directorios $HOMEcon un simple glob de shell y pruebe cada uno contra su expresión regular, rompiendo una coincidencia y finalmente probando si la BASH_REMATCHmatriz no está vacía:
#!/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
Una forma alternativa sería utilizar un globo de caparazón extendido en lugar de la expresión regular y capturar cualquier coincidencia de globo en una matriz. Luego pruebe si la matriz no está vacía:
#!/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
El seguimiento /garantiza que solo los directorios coincidan; la nullglobevita que la cáscara de regresar la cadena sin igual en el caso de los partidos cero.
Para hacer que sea recursivo, configure la globstaropción de shell ( shopt -s globstar) y luego respectivamente: -