Bash foreach loop


158

ฉันมีอินพุต (สมมุติว่าไฟล์) ในแต่ละบรรทัดจะมีชื่อไฟล์ ฉันจะอ่านไฟล์นี้และแสดงเนื้อหาสำหรับแต่ละไฟล์ได้อย่างไร

คำตอบ:


234

สิ่งนี้จะทำ:

xargs cat <filenames.txt

xargsโปรแกรมอ่านเข้ามาตรฐานของตนและแต่ละบรรทัดของการป้อนข้อมูลรันcatโปรแกรมกับเส้นที่นำเข้าเป็นอาร์กิวเมนต์ (s)

หากคุณต้องการทำสิ่งนี้เป็นวงคุณสามารถ:

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

3
ทั้งสองอย่างนี้ไม่ทำงานเมื่อชื่อไฟล์มีช่องว่าง
mivk

@mivk คุณสามารถหลบหนีจากอวกาศ
Toochka


18

นี่คือwhileลูป:

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

นี่ควรเป็นแนวทางที่ดีที่สุด คุณต้องใช้ตัวเลือก '-r' & '-d' กับread
sjsam

1
ต่างจากคำตอบอื่น ๆ ส่วนใหญ่ที่นี่คำตอบนี้ใช้งานได้จริงแม้ว่าชื่อไฟล์จะมีช่องว่าง
mivk


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

(วิธีนี้ยังใช้งานได้หากชื่อไฟล์มีช่องว่าง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.