Bash foreach loop


158

Ho un input (diciamo un file). Su ogni riga c'è un nome file. Come posso leggere questo file e visualizzare il contenuto di ognuno.

Risposte:


234

Qualcosa del genere farebbe:

xargs cat <filenames.txt

Il xargsprogramma legge il suo input standard e per ogni riga di input esegue il catprogramma con le righe di input come argomento (i).

Se vuoi davvero farlo in un ciclo, puoi:

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

3
Entrambi non funzionano quando i nomi dei file contengono spazi.
Mivk,

@mivk puoi sfuggire allo spazio
Toochka


18

Ecco un whileciclo:

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

Questo dovrebbe essere l'approccio migliore. Devi usare l'opzione '-r' & '-d' conread
sjsam

1
A differenza della maggior parte delle altre risposte qui, questa funziona davvero, anche quando i nomi dei file contengono spazi.
mivk

5
xargs --arg-file inputfile cat

Questo produrrà il nome del file seguito dal contenuto del file:

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

4

Probabilmente vorrai gestire gli spazi nei nomi dei tuoi file, per quanto orribili siano :-)

Quindi inizialmente opterei per qualcosa del tipo:

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

Se hanno tutti la stessa estensione (ad esempio .jpg), puoi usare questo:

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

(Questa soluzione funziona anche se il nome file ha spazi)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.