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.

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

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

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 %"

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> _


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)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.