बैश फॉरच लूप


158

मेरे पास एक इनपुट है (चलो एक फ़ाइल कहते हैं)। प्रत्येक लाइन पर एक फ़ाइल नाम होता है। मैं इस फ़ाइल को कैसे पढ़ सकता हूं और प्रत्येक के लिए सामग्री प्रदर्शित कर सकता हूं।

जवाबों:


234

कुछ ऐसा होगा:

xargs cat <filenames.txt

xargsकार्यक्रम अपने मानक इनपुट पढ़ता है, और इनपुट की प्रत्येक पंक्ति में चलाता catतर्क (रों) के रूप में इनपुट लाइनों के साथ कार्यक्रम।

यदि आप वास्तव में एक पाश में यह करना चाहते हैं, तो आप कर सकते हैं:

for fn in `cat filenames.txt`; do
    echo "the next file is $fn"
    cat $fn
done

3
फ़ाइल नाम रिक्त स्थान होने पर ये दोनों काम नहीं करते हैं।
mivk

@ मिवक आप अंतरिक्ष से बच सकते हैं
तोचका


18

यहाँ एक whileपाश है:

while read filename
do
    echo "Printing: $filename"
    cat "$filename"
done < filenames.txt

यह सबसे अच्छा तरीका होना चाहिए। आप के साथ '-r' और '-d' विकल्प का उपयोग करेंread
sjsam

1
यहां अधिकांश अन्य उत्तरों के विपरीत, यह वास्तव में काम करता है, तब भी जब फ़ाइल नामों में स्थान होते हैं।
मिवक


4

आप संभवतः अपने फ़ाइल नामों में रिक्त स्थान को संभालना चाहेंगे, घृणा हालांकि वे :-)

इसलिए मैं शुरू में कुछ इस तरह का विकल्प चुनूंगा:

pax> cat qq.in
normalfile.txt
file with spaces.doc

pax> sed 's/ /\\ /g' qq.in | xargs -n 1 cat
<<contents of 'normalfile.txt'>>
<<contents of 'file with spaces.doc'>>

pax> _


0

यदि उन सभी का विस्तार समान है (उदाहरण के लिए .jpg), तो आप इसका उपयोग कर सकते हैं:

for picture in  *.jpg ; do
    echo "the next file is $picture"
done

(यह समाधान भी काम करता है यदि फ़ाइलनाम में स्थान हो)

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