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?

Danidacar
quelle

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
Greg Hewgill
quelle
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
Dogbane
quelle
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 %"
Bis auf weiteres angehalten.
quelle
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> _
paxdiablo
quelle
3
cat `cat filenames.txt`

wird den Trick machen

Alan Dyke
quelle
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.)

Israel P.
quelle