Đây là một điều khó khăn đáng ngạc nhiên để làm độc đáo.
Về cơ bản, -d
sẽ chỉ kiểm tra một đối số duy nhất - ngay cả khi bạn có thể khớp tên tệp bằng biểu thức chính quy.
Một cách sẽ là lật lại vấn đề và kiểm tra các thư mục cho một trận đấu regex thay vì kiểm tra trận đấu regex cho các thư mục. Nói cách khác, lặp qua tất cả các thư mục $HOME
bằng cách sử dụng shell shell đơn giản và kiểm tra từng thư mục dựa trên biểu thức chính quy của bạn, phá vỡ một trận đấu, cuối cùng kiểm tra xem BASH_REMATCH
mảng đó có trống không:
#!/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
Một cách khác là sử dụng một quả cầu vỏ mở rộng thay cho biểu thức chính quy và ghi lại bất kỳ trận đấu toàn cầu nào trong một mảng. Sau đó kiểm tra nếu mảng không trống:
#!/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
Các trailing /
đảm bảo rằng chỉ các thư mục được khớp; các nullglob
ngăn vỏ từ trả lại chuỗi chưa từng có trong trường hợp của zero trận đấu.
Để thực hiện đệ quy, hãy đặt globstar
tùy chọn shell ( shopt -s globstar
) và sau đó: