array=${ls -d */}
echo ${array[@]}
मेरे पास तीन निर्देशिकाएं हैं ww
ee
qq
:। मैं उन्हें एक सरणी में चाहता हूं और फिर सरणी को प्रिंट करता हूं।
array=${ls -d */}
echo ${array[@]}
मेरे पास तीन निर्देशिकाएं हैं ww
ee
qq
:। मैं उन्हें एक सरणी में चाहता हूं और फिर सरणी को प्रिंट करता हूं।
जवाबों:
यह यह होगा
array=($(ls -d */))
EDIT: अधिक सामान्य उत्तर के लिए गॉर्डन डेविसन का समाधान देखें (यानी यदि आपके फ़ाइलनाम में विशेष वर्ण हैं)। यह उत्तर केवल एक सिंटैक्स सुधार है।
ARR+=('$(ls -d */)')
किसी ऐरे में तत्वों को संपादित करने के लिए बिल्ट-इन का उपयोग करें, जबकि विशेष वर्णों से निपटने के लिए एकल एलिमेंट्स का उपयोग करते हुए, उन तत्वों को जोड़ने या हटाने के लिए। सरणी। एकल उद्धरण शाब्दिक वर्णों को संरक्षित करते हैं और निर्देशिका नामों में उनसे निपटने के लिए भागने की किसी भी आवश्यकता को हटाते हैं।
declare -a ARR; ARR+=('$(ls -d "$INPUT_DIR"/*)')
केवल रिटर्न$(ls -d $INPUT_DIR/*)
ARR+=("$(ls -d */)")
कार्य करना चाहिए। अगर नहीं तो मुझे बताएं।
जब भी संभव हो, आपको आउटपुट को पार्स करने से बचना चाहिए ls
( विषय पर ग्रेग की विकी देखें )। असल में, ls
अगर किसी भी फिल्मनाम में मज़ेदार चरित्र हैं , तो इसका उत्पादन अस्पष्ट होगा। यह भी आमतौर पर समय की बर्बादी है। इस मामले में, जब आप निष्पादित करते हैं ls -d */
, तो क्या होता है कि शेल */
उपनिर्देशिकाओं की सूची में फैलता है (जो पहले से ही वास्तव में आप क्या चाहते हैं), उस सूची को तर्कों के रूप में पारित करता है ls -d
, जो प्रत्येक को देखता है, कहता है "हां, यह एक निर्देशिका है सब ठीक है "और इसे प्रिंट करता है (एक असंगत और कभी-कभी अस्पष्ट प्रारूप में)। ls
आदेश में कुछ भी उपयोगी नहीं कर रहा है!
ठीक है, ठीक है, यह एक काम कर रहा है जो उपयोगी है: यदि कोई उपनिर्देशिका नहीं */
है, तो जैसा है वैसे ही छोड़ दिया ls
जाएगा , "*" नामक उपनिर्देशिका की तलाश करेंगे, इसे न ढूंढें, एक त्रुटि संदेश प्रिंट करें जो कि मौजूद नहीं है (में है) stderr), और "* /" (stdout में) प्रिंट न करें ।
उपनिर्देशिका नामों की एक सरणी बनाने के लिए क्लीनर तरीका है कि इसे पास किए बिना ग्लोब ( */
) का उपयोग किया जाए । लेकिन सरणी में "* /" डालने से बचने के लिए अगर कोई वास्तविक उपनिर्देशिका नहीं है, तो आपको पहले नलग्लोब सेट करना चाहिए (फिर से, ग्रेग की विकि देखें ):ls
shopt -s nullglob
array=(*/)
shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later
echo "${array[@]}" # Note double-quotes to avoid extra parsing of funny characters in filenames
यदि आप कोई त्रुटि संदेश मुद्रित करना चाहते हैं यदि कोई उपनिर्देशिका नहीं है, तो आप इसे स्वयं करना बेहतर मानते हैं:
if (( ${#array[@]} == 0 )); then
echo "No subdirectories found" >&2
fi
/
dir नाम नहीं चाहिए तो क्या होगा ?
ls
एक साधारण आदेश है। यह आउटपुट स्ट्रिंग्स है। बैरिंग पार्सिंग स्ट्रिंग्स में अत्यधिक अच्छा है। उचित रेगेक्स वह सब है जो सुरक्षित रूप से ls
आउटपुट को पार्स करने के लिए आवश्यक है ।
ls
अजीब / गैर-चरित्र वाले पात्रों के साथ करते हैं, इसलिए इसका उत्पादन फिल्माने की सूची में पार्स करने का कोई सुसंगत तरीका नहीं है। और जैसा कि मैंने कहा, यह वास्तव में कुछ भी उपयोगी नहीं है: यदि आप सही तरीके से आउटपुट को पार्स करते हैं ls -d */
, तो आप ठीक उसी चीज़ से हवा निकालेंगे जो आपको सीधे मिलेगी */
(जब कोई मैच नहीं हैं, और इसके लिए जांच करना आसान है)।
A lazy sysadmin is a good sysadmin.
शायद मेरा अपना ls
पार्सिंग उस संस्करण के लिए विशिष्ट है जो मेरे पास है, या जिसका मैं उपयोग कर रहा हूं, लेकिन अभी तक उनके पास लिनक्स डिस्ट्रोस पर कोई समस्या नहीं है जो मैंने उन पर परीक्षण किया है। मैं केवल अनुभव से बोल सकता हूं।
यह उन निर्देशिकाओं में फ़ाइलों को लाइन से प्रिंट करेगा।
array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"