Bash foreach loop

158

Saya punya input (misalkan file). Di setiap baris ada nama file. Bagaimana saya bisa membaca file ini dan menampilkan konten untuk masing-masing.

nascar
sumber

Jawaban:

234

Sesuatu seperti ini akan dilakukan:

xargs cat <filenames.txt

The xargsprogram membaca input standar, dan untuk setiap baris masukan menjalankan catprogram dengan jalur input sebagai argumen (s).

Jika Anda benar-benar ingin melakukan ini dalam satu lingkaran, Anda dapat:

for fn in `cat filenames.txt`; do
    echo "the next file is $fn"
    cat $fn
done
Greg Hewgill
sumber
3
Keduanya tidak berfungsi saat nama file mengandung spasi.
mivk
@mivk Anda dapat melarikan diri dari ruang angkasa
Toochka
18

Ini sebuah whileloop:

while read filename
do
    echo "Printing: $filename"
    cat "$filename"
done < filenames.txt
dogbane
sumber
Ini harus menjadi pendekatan terbaik. Anda dengan menggunakan opsi '-r' & '-d' denganread
sjsam
1
Tidak seperti kebanyakan jawaban lain di sini, jawaban ini benar-benar berfungsi, bahkan ketika nama file berisi spasi.
mivk
5
xargs --arg-file inputfile cat

Ini akan menampilkan nama file diikuti dengan isi file:

xargs --arg-file inputfile -I % sh -c "echo %; cat %"
Dijeda sampai pemberitahuan lebih lanjut.
sumber
4

Anda mungkin ingin menangani spasi dalam nama file Anda, meskipun mereka :-)

Jadi saya akan memilih awalnya untuk sesuatu seperti:

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> _
paxdiablo
sumber
3
cat `cat filenames.txt`

akan melakukan trik

Alan Dyke
sumber
0

Jika mereka semua memiliki ekstensi yang sama (misalnya .jpg), Anda dapat menggunakan ini:

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

(Solusi ini juga berfungsi jika nama file memiliki spasi)

Israel P
sumber