2012-06-11 12 views
41

मैं फ़ाइलों की सूची प्राप्त करने के लिए ls चलाने के लिए चाहता हूं और फिर परिणाम को उस सरणी में पढ़ना चाहता हूं जहां प्रत्येक तत्व फ़ाइल नाम से मेल खाता हो। क्या यह संभव है?फाइलों को एक सरणी में पढ़ना

arr=(*) 

echo ${#arr[@]} # will echo number of elements in array 

echo "${arr[@]}" # will dump all elements of the array 
+0

हां, यह संभव है। शायद सलाह नहीं दी जा सकती है कि नामों में मनमाना वर्ण हो सकते हैं (नामों में रिक्त स्थान और न्यूलाइनें दुःख का कारण बनती हैं), लेकिन यह करने योग्य है। मैनुअल के किस बिट को आपको समझ में कठिनाई हुई? –

उत्तर

65

ls का उपयोग न करें, यह नहीं है: echo *

arr=($(ls)) 

बहुत बेहतर और ls सुरक्षित की तुलना में आप का उपयोग कर सकते हैं:

+0

धन्यवाद, क्या वैसे भी मैं इन परिणामों के पाइप कर सकता हूं? मैंने एआर (* | grep ".txt") की तरह कुछ करने की कोशिश की लेकिन यह इसे पसंद नहीं करता है। – dublintech

+7

@dublintech: आपको 'grep' की आवश्यकता नहीं है, बस अपने ग्लोब में स्ट्रिंग शामिल करें: 'array = (*। Txt)' या 'array = (* foo *)' –

+0

धन्यवाद डेनिस। वह काम किया। – dublintech

11

मौजूदा निर्देशिका में ls उत्पादन के साथ आगमन एक सरणी पैदा करेगा के बाद इस उद्देश्य के लिए इरादा है। ग्लोबिंग का प्रयोग करें।

shopt -s nullglob 
array=(*) 
array2=(file*) 
array3=(dir/*) 

nullglob विकल्प का कारण बनता है अगर कोई मिलान किया जाता है सरणी खाली किया जाना है।

+2

'ls' आवश्यक नहीं है और इस उद्देश्य के लिए उपयोग नहीं किया जाना चाहिए। –

+0

सहमत हुए, मैं बस कुछ कमांड आउटपुट से सरणी बनाने का तरीका बताना चाहता था। हालांकि मैंने तनाव का जवाब संपादित किया कि 'एलएस' आउटपुट से बचा जाना चाहिए। – anubhava

+2

जब सरणी विस्तार उद्धृत नहीं किया जाता है, तो सरणी के सभी तत्वों को सरणी के अलग-अलग तत्वों की बजाय स्ट्रिंग के रूप में दर्शाया जाता है। अनकही '$ {arr [*]}' और '$ {arr [@]}' वही हैं। – jordanm

4

दरअसल, ls जाने का कोई तरीका नहीं है। और

echo ${FILELIST[x] 

-या-

echo ${FILELIST[@]:x:y} 

जहां x & y पहला तत्व हैं पाने के लिए के बाद कितने तत्वों: इस प्रयास करें:

declare -a FILELIST 
for f in *; do 
    #FILELIST[length_of_FILELIST + 1]=filename 
    FILELIST[${#FILELIST[@]}+1]=$(echo "$f"); 
done 

सरणी से नाम प्राप्त करने के लिए उस।

बैश सरणियों पर एक बड़ा ट्यूटोरियल के लिए देखें: http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

+1

के लिए अपवोड किया गया है आपको फ़ाइल ग्लोब पर फिर से चालू करना चाहिए * या * मेरे उत्तर में फ़ाइल ग्लोब का उपयोग करके एक सरणी बनाएं - नहीं * दोनों *! किसी सरणी में तत्व जोड़ते समय, किसी जटिल अनुक्रमणिका अभिव्यक्ति में सरणी की लंबाई का उपयोग करने का कोई कारण नहीं है (यह एक चीज के लिए सरणी स्पैस होने पर उम्मीद के अनुसार काम नहीं करेगा)। 'सरणी + = (तत्व)'। '$ (Echo" $ f ") का उपयोग करने का कोई कारण नहीं है, बस सीधे असाइनमेंट करें।आपके 'इको' कथन में से एक पर एक गुम बंद घुंघराले ब्रेस है। –

0

इस प्रयास करें,

PATH="" # could set to any absolute path 
declare -a ARRAY=(${PATH}/*) 

मैं आपको बाद में सूची से अवांछित सामान बाहर खींच जाएगा संभालने हूँ।

संबंधित मुद्दे