Bash foreach Schleife


158

Ich habe eine Eingabe (sagen wir eine Datei). In jeder Zeile befindet sich ein Dateiname. Wie kann ich diese Datei lesen und den Inhalt für jede einzelne anzeigen?

Antworten:


234

So etwas würde reichen:

xargs cat <filenames.txt

Das xargsProgramm liest seine Standardeingabe und führt für jede Eingabezeile das catProgramm mit den Eingabezeilen als Argument (e) aus.

Wenn Sie dies wirklich in einer Schleife tun möchten, können Sie:

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

3
Beide funktionieren nicht, wenn die Dateinamen Leerzeichen enthalten.
Mivk

@mivk du kannst dem Weltraum entkommen
Toochka


18

Hier ist eine whileSchleife:

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

Dies sollte der beste Ansatz sein. Sie müssen die Option '-r' & '-d' mitread
sjsam

1
Im Gegensatz zu den meisten anderen Antworten hier funktioniert diese tatsächlich, selbst wenn Dateinamen Leerzeichen enthalten.
Mivk

5
xargs --arg-file inputfile cat

Dadurch wird der Dateiname gefolgt vom Inhalt der Datei ausgegeben:

xargs --arg-file inputfile -I % sh -c "echo %; cat %"

4

Sie werden wahrscheinlich Leerzeichen in Ihren Dateinamen behandeln wollen, obwohl sie abscheulich sind :-)

Also würde ich mich zunächst für etwas entscheiden wie:

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

Wenn alle dieselbe Erweiterung haben (z. B. .jpg), können Sie Folgendes verwenden:

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

(Diese Lösung funktioniert auch, wenn der Dateiname Leerzeichen enthält.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.