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.

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

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

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


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> _


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)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.