Петля bash foreach


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

@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

(Это решение также работает, если в имени файла есть пробелы)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.