Bash foreach loop

158

Mam dane wejściowe (powiedzmy plik). W każdym wierszu znajduje się nazwa pliku. Jak mogę przeczytać ten plik i wyświetlić zawartość każdego z nich.

danidacar
źródło

Odpowiedzi:

234

Coś takiego zrobiłoby:

xargs cat <filenames.txt

xargsProgram odczytuje swoje standardowe wejście, a dla każdej linii wejścia uruchamia catprogram z linii wejściowych jako argument (y).

Jeśli naprawdę chcesz to robić w pętli, możesz:

for fn in `cat filenames.txt`; do
    echo "the next file is $fn"
    cat $fn
done
Greg Hewgill
źródło
3
Oba nie działają, gdy nazwy plików zawierają spacje.
mivk
@mivk, możesz uciec z kosmosu
Toochka
18

Oto whilepętla:

while read filename
do
    echo "Printing: $filename"
    cat "$filename"
done < filenames.txt
dogbane
źródło
To powinno być najlepsze podejście. Możesz użyć opcji „-r” i „-d” zread
sjsam
1
W przeciwieństwie do większości innych odpowiedzi tutaj, ta faktycznie działa, nawet jeśli nazwy plików zawierają spacje.
mivk
5
xargs --arg-file inputfile cat

Spowoduje to wyświetlenie nazwy pliku, a po niej zawartości pliku:

xargs --arg-file inputfile -I % sh -c "echo %; cat %"
Wstrzymano do odwołania.
źródło
4

Prawdopodobnie będziesz chciał obsłużyć spacje w nazwach plików, choć są one odrażające :-)

Więc początkowo wybrałbym coś takiego:

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
źródło
3
cat `cat filenames.txt`

da rade

Alan Dyke
źródło
0

Jeśli wszystkie mają to samo rozszerzenie (na przykład .jpg), możesz użyć tego:

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

(To rozwiązanie działa również, jeśli nazwa pliku zawiera spacje)

Israel P.
źródło