यह अच्छी तरह से करने के लिए आश्चर्यजनक रूप से मुश्किल काम है।
मौलिक रूप से, -d
केवल एक तर्क का परीक्षण करेंगे - भले ही आप नियमित अभिव्यक्ति का उपयोग करके फ़ाइल नाम से मेल खा सकते हों।
एक तरीका यह होगा कि समस्या को इधर-उधर किया जाए, और डायरेक्टरी के लिए रेगेक्स मैच का परीक्षण करने के बजाय रेगेक्स मैच के लिए डायरेक्ट्री टेस्ट करें। दूसरे शब्दों में, एक सरल शेल ग्लोब का उपयोग करने में सभी निर्देशिकाओं पर लूप करें $HOME
, और अपने रेगेक्स के खिलाफ प्रत्येक का परीक्षण करें, एक मैच पर ब्रेक लगाना, अंत में परीक्षण करना कि क्या BASH_REMATCH
सरणी गैर-रिक्त है:
#!/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
एक वैकल्पिक तरीका होगा कि रेगेक्स के स्थान पर एक विस्तारित शेल ग्लोब का उपयोग किया जाए, और किसी भी ग्लोब मैच को एक सरणी में कैप्चर किया जाए। फिर परीक्षण करें कि क्या सरणी गैर-रिक्त है:
#!/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
अनुगामी /
सुनिश्चित करता है कि केवल निर्देशिकाओं का मिलान हो; nullglob
शून्य मैचों के मामले में बेजोड़ स्ट्रिंग लौटने से खोल से बचाता है।
या तो पुनरावर्ती बनाने के लिए, globstar
शैल विकल्प ( shopt -s globstar
) और फिर क्रमशः सेट करें : -