Ini adalah hal yang sangat sulit dilakukan dengan baik.
Pada dasarnya, -d
hanya akan menguji satu argumen - bahkan jika Anda bisa mencocokkan nama file menggunakan ekspresi reguler.
Salah satu caranya adalah membalik masalah, dan menguji direktori untuk kecocokan regex alih-alih menguji kecocokan regex untuk direktori. Dengan kata lain, loop semua direktori dalam $HOME
menggunakan glob shell sederhana, dan uji masing-masing terhadap regex Anda, memecahkan pertandingan, akhirnya menguji apakah BASH_REMATCH
array tidak kosong:
#!/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
Cara alternatif adalah dengan menggunakan glob shell diperpanjang di tempat regex, dan menangkap setiap pertandingan glob dalam array. Kemudian uji apakah array tidak kosong:
#!/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
Trailing /
memastikan bahwa hanya direktori yang cocok; yang nullglob
mencegah shell dari kembali string yang tak tertandingi dalam kasus nol pertandingan.
Untuk membuat rekursif, atur globstar
opsi shell ( shopt -s globstar
) dan kemudian masing-masing: -