Esto es algo sorprendentemente complicado de hacer bien.
Básicamente, -d
solo 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 $HOME
con un simple glob de shell y pruebe cada uno contra su expresión regular, rompiendo una coincidencia y finalmente probando si la BASH_REMATCH
matriz 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 nullglob
evita que la cáscara de regresar la cadena sin igual en el caso de los partidos cero.
Para hacer que sea recursivo, configure la globstar
opción de shell ( shopt -s globstar
) y luego respectivamente: -