Bu güzel yapmak şaşırtıcı derecede zor bir şeydir.
Temel olarak, -dnormal bir ifade kullanarak dosya adlarını eşleştirseniz bile, yalnızca tek bir argümanı test eder.
Bunun bir yolu, sorunu tersine çevirmek ve dizinler için normal ifade eşleşmesini test etmek yerine dizinleri normal ifade eşleşmesi için test etmektir. Başka bir deyişle, basit bir kabuk glob kullanarak tüm dizinler üzerinde döngü $HOMEve her bir regex karşı test, bir maç kırma, nihayet BASH_REMATCHdizi boş olmadığını test :
#!/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
Alternatif bir yol, normal ifade yerine genişletilmiş bir kabuk glob kullanmak ve bir dizideki herhangi bir glob eşleşmesini yakalamak olabilir. Ardından dizinin boş olup olmadığını test edin:
#!/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
İzleyen /sadece dizinlerin eşleşmesini sağlar; nullglobSıfır maçların durumunda eşsiz dize döndürmesini kabuk engeller.
Her iki özyinelemeyi yapmak için, globstarkabuk seçeneğini ( shopt -s globstar) ve ardından sırasıyla ayarlayın: