Петля 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
5
xargs --arg-file inputfile cat

Это выведет имя файла, за которым следует содержимое файла:

xargs --arg-file inputfile -I % sh -c "echo %; cat %"
Приостановлено до дальнейшего уведомления.
источник
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> _
paxdiablo
источник
3
cat `cat filenames.txt`

сделает свое дело

Алан Дайк
источник
0

Если они имеют одинаковое расширение (например, .jpg), вы можете использовать это:

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

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

Израиль П
источник