2009-05-20 15 views
9

bash में, मैं एक सूची के पहले n तत्वों कैसे मुद्रित कर सकते हैं?बैश में, मैं सूची के पहले एन तत्वों को कैसे प्रिंट कर सकता हूं?

उदाहरण के लिए

, इस सूची में पहले 10 फाइलें:

FILES=$(ls) 

अद्यतन: मैं कहना है कि मैं, एक पंक्ति में तत्वों मुद्रित करने के लिए ठीक वैसे ही जैसा आप के साथ पूरी सूची प्रिंट चाहते भूल गया echo $FILES

+0

मैंने अपने समाधान में एक छोटा सुधार किया। इसे सभी फाइलनामों को एक पंक्ति पर मुद्रित करना चाहिए। क्या तुमने कोशिश की? –

+1

कृपया पढ़ें: http://mywiki.wooledge.org/ParsingLs - यदि आप अपनी फाइलों पर आपदाओं से बचना चाहते हैं तो यह महत्वपूर्ण है कि आप बाधाओं की जटिलताओं और नुकसान को समझें। – lhunath

उत्तर

22
FILES=(*) 
echo "${FILES[@]:0:10}" 

फ़ाइल नामों में रिक्त स्थान होने पर भी सही तरीके से काम करना चाहिए।

FILES=$(ls) एक स्ट्रिंग चर पैदा करता है। FILES=(*) एक सरणी बनाता है। अधिक examples on using arrays in bash के लिए यह पृष्ठ देखें। (धन्यवाद lhunath)

+0

जो पहले 10 अक्षरों को प्रिंट करता है, है ना? – Frank

+0

नहीं, यह एक सरणी के पहले 10 तत्वों को प्रिंट करता है। सरणी में फ़ाइल नामों को आइटम के रूप में शामिल किया गया है। –

+0

एबीएस का आपका संदर्भ खराब है। वे उद्धरण (सामान्य एबीएस) का उपयोग नहीं करते हैं, इस प्रकार विस्तारित फ़ाइल नाम पर शब्दों को बगैर बनाते हैं। एबीएस ऐसी छिपी हुई बग से भरा है जो किसी भी व्यक्ति से सीखता है (जो आपको छोड़कर, गारंटी देता है, आप इसे सही करते हैं) उन बगों का वारिस करने के लिए! मैं इसके बजाए http://mywiki.wooledge.org/BashGuide/TheBasics/Arrays का उल्लेख करूंगा। – lhunath

0
FILES=$(ls) 
echo $FILES | fmt -1 | head -10 
+2

यदि उनके नामों में रिक्त स्थान वाली फ़ाइलें हैं तो अपेक्षित कार्य नहीं करता है। –

+0

मुझे इसके बारे में पता है, लेकिन सोचा था कि डेहमान इस विशिष्ट विधि का उपयोग करना चाहता था, इसलिए मुझे लगता है कि रिक्त स्थान कोई समस्या नहीं होगी। BTW, आप फ़ाइलें = (*) गूंज मतलब था "$ {फ़ाइलें [@]: 00:10}" ? यह यहां बेहतर काम करता है। – sunny256

+1

दरअसल, मैं इसे सही करता हूं। धन्यवाद! –

2
echo $FILES | awk '{for (i = 1; i <= 10; i++) {print $i}}' 

संपादित करें: आह, अपनी टिप्पणी है कि आप उन्हें एक पंक्ति में जरूरत ...

echo $FILES | awk '{for (i = 1; i <= 10; i++) {printf "%s ", $i}}' 

एक है कि करता है कि याद किया।

1

यह सहभागी करने के लिए:

set $FILES && eval eval echo \\\${1..10}

एक स्क्रिप्ट के रूप में इसे चलाने के लिए, सामग्री

N=$1; shift; eval eval echo \\\${1..$N}

साथ foo.sh बना सकते हैं और

bash foo.sh 10 $FILES

रूप में चलाते हैं
5
FILE="$(ls | head -1)" 

फ़ाइल नामों में रखरखाव वाले रिक्त स्थान को सही ढंग से भी मैं इसे जब की कोशिश की।

+0

यह आपको कई निर्देशिका दे सकता है। शायद आपका मतलब '$ (एलएस -1 | हेड -1)' है? – nh2

4

क्यों नहीं सिर्फ इस पहले 50 फ़ाइलों को मुद्रित करने के लिए:

ls -1 | head -50 
+0

ओपी चाहता था कि यह एक पंक्ति पर मुद्रित हो। टिप्पणी देखो। – kubanczyk

2

मेरे तरीका होगा:

ls | head -10 | tr "\n" " " 

यह पहले 10 लाइनों ls द्वारा दिया प्रिंट होगा, और फिर टीआर सब बदल देता है रिक्त स्थान के साथ लाइन ब्रेक। आउटपुट एक लाइन पर होगा।

+0

अच्छा जवाब। मुझे शायद आपको '-1' जैसे 'ls -1 |' भी जोड़ना चाहिए हेड -10 | tr "\ n" "" '। किसी भी मामले में मैं यही खोज रहा था;) – silgon

+0

यह मेरी राय में सबसे अच्छा जवाब है। अच्छा और सरल उनकी सूची बनाओ। पहले 10 का चयन करें रिक्त स्थान के लिए नई लाइनों को बाहर निकालें। किया और किया। अच्छा उत्तर। – user2233949

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

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