Vòng lặp Bash foreach


158

Tôi có một đầu vào (giả sử một tập tin). Trên mỗi dòng có một tên tập tin. Làm thế nào tôi có thể đọc tệp này và hiển thị nội dung cho từng người.

Câu trả lời:


234

Một cái gì đó như thế này sẽ làm:

xargs cat <filenames.txt

Các xargschương trình đọc đầu vào tiêu chuẩn của nó, và cho mỗi dòng đầu vào chạy catchương trình với các dòng đầu vào như là đối số (s).

Nếu bạn thực sự muốn làm điều này trong một vòng lặp, bạn có thể:

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

3
Cả hai đều không hoạt động khi tên tệp chứa khoảng trắng.
mivk

@mivk bạn có thể thoát khỏi không gian
Toochka


18

Đây là một whilevòng lặp:

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

Điều này nên được tiếp cận tốt nhất. Bạn có thể sử dụng tùy chọn '-r' & '-d' vớiread
sjsam

1
Không giống như hầu hết các câu trả lời khác ở đây, câu trả lời này thực sự hoạt động, ngay cả khi tên tệp chứa khoảng trắng.
mivk


4

Bạn có thể muốn xử lý khoảng trắng trong tên tệp của mình, gớm ghiếc mặc dù chúng là :-)

Vì vậy, tôi sẽ chọn ban đầu cho một cái gì đó như:

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

Nếu tất cả chúng đều có cùng một phần mở rộng (ví dụ .jpg), bạn có thể sử dụng phần này:

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

(Giải pháp này cũng hoạt động nếu tên tệp có khoảng trắng)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.