Петля переднього плану


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.