Loop foreach Bash

158

Eu tenho uma entrada (digamos um arquivo). Em cada linha há um nome de arquivo. Como posso ler este arquivo e exibir o conteúdo de cada um.

danidacar
fonte

Respostas:

234

Algo assim faria:

xargs cat <filenames.txt

O xargsprograma lê sua entrada padrão e, para cada linha de entrada, executa o catprograma com as linhas de entrada como argumento (s).

Se você realmente deseja fazer isso em um loop, pode:

for fn in `cat filenames.txt`; do
    echo "the next file is $fn"
    cat $fn
done
Greg Hewgill
fonte
3
Ambos não funcionam quando os nomes de arquivos contêm espaços.
Mivk
@mivk você pode escapar do espaço
Toochka 13/01
18

Aqui está um whileloop:

while read filename
do
    echo "Printing: $filename"
    cat "$filename"
done < filenames.txt
dogbane
fonte
Essa deve ser a melhor abordagem. Você deve usar a opção '-r' e '-d' comread
sjsam
1
Diferentemente da maioria das outras respostas aqui, essa realmente funciona, mesmo quando os nomes de arquivos contêm espaços.
Mivk
5
xargs --arg-file inputfile cat

Isso produzirá o nome do arquivo seguido pelo conteúdo do arquivo:

xargs --arg-file inputfile -I % sh -c "echo %; cat %"
Pausado até novo aviso.
fonte
4

Você provavelmente desejará lidar com espaços em seus nomes de arquivos, por mais abomináveis ​​que sejam :-)

Então, eu optaria inicialmente por algo como:

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
fonte
3
cat `cat filenames.txt`

fará o truque

Alan Dyke
fonte
0

Se todos eles tiverem a mesma extensão (por exemplo .jpg), você poderá usar isto:

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

(Esta solução também funciona se o nome do arquivo tiver espaços)

Israel P
fonte