ग्लोब पैटर्न का विस्तार करने का सबसे अच्छा तरीका?


29

मुझे प्रोग्राम की रूप से फ़ाइलों की एक सूची में एक ग्लोब पैटर्न (जैसे ../smth*/*, या /etc/cron*/) का विस्तार करने की आवश्यकता है । इसे करने का सबसे अच्छा तरीका क्या होगा?


2
आपको कुछ विशेष करने की आवश्यकता नहीं है, बस बोली न दें *
केविन

1
यद्यपि यदि आप इसे पार्स करने की कोशिश कर रहे हैं, तो उत्तर की तरह एक सरणी का उपयोग करें।
केविन

जवाबों:


40

बस इसे एक सरणी घोषणा के दाईं ओर के अंदर विस्तारित होने दें:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


ध्यान दें कि शेल विकल्प nullglobसेट करने की आवश्यकता है।
यह डिफ़ॉल्ट रूप से सेट नहीं है।
यह ग्लोब (या एक से अधिक ग्लब्स में से एक) किसी भी नाम से मेल नहीं खाने की स्थिति में एक त्रुटि को रोकता है।

इसके bashसाथ सेट करें

shopt -s nullglob

या zshसाथ में

setopt nullglob

और मैं उस सूची को बाद में कैसे प्रिंट करूं?
दुष्ट

यह सिर्फ एक नियमित सरणी है। आप किसी भी ऐरे से जो भी कर सकते हैं, कर सकते हैं। कुछ उदाहरण जोड़े।
मैनटवर्क

1
वहाँ एक समस्या है। यदि पैटर्न किसी फाइल से मेल नहीं खाता है, तो यह खुद को प्रिंट करता है - जो बहुत अच्छा नहीं है।
रोजा

5
आह, दुकान -s nullglob इसे हल करती है।
रोगाच

1
@ लिंडे, unsetoptऔर उसी पैरामीटर के लिए जिसका उपयोग किया जाता है setopt
५:१५ बजे

0

चीजों को ओवरक्लम्पलेट करने की आवश्यकता नहीं:

echo your/stuff*

यह काम नहीं करता है। उदाहरण के लिए: TEST=$(echo your/stuff*) && eval \"$TEST\"आउटपुट होगा:your/stuff*: No such file or directory
सेबस्टियन

@ सेबैस्टियन यह एक नलग्लोब मुद्दा है, ऊपर देखें
अलेक्सई एवेर्चेनो

1
नहीं, यह एक अशक्त समस्या नहीं है। बलात्कार के पात्रों का उपयोग TESTचर का एक स्ट्रिंग के रूप में मूल्यांकन कर *रहा है जिसमें शामिल है और इसका विस्तार नहीं किया जा रहा है।
सेबेस्टियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.