É uma coisa surpreendentemente complicada de se fazer bem.
Fundamentalmente, -d
testará apenas um único argumento - mesmo se você puder corresponder os nomes de arquivos usando uma expressão regular.
Uma maneira seria inverter o problema e testar os diretórios para uma correspondência de regex em vez de testar a correspondência de regex para diretórios. Em outras palavras, faça um loop sobre todos os diretórios $HOME
usando um simples shell glob e teste cada um deles em relação ao seu regex, quebrando uma correspondência e finalmente testando se a BASH_REMATCH
matriz não está vazia:
#!/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
Uma maneira alternativa seria usar um globo de shell estendido no lugar do regex e capturar quaisquer correspondências de globos em uma matriz. Em seguida, teste se a matriz não está vazia:
#!/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
O final /
garante que apenas os diretórios sejam correspondidos; o nullglob
evita que o shell de retornar a string inigualável no caso de zero partidas.
Para tornar recursivo, defina a globstar
opção shell ( shopt -s globstar
) e, em seguida, respectivamente: -