Respostas:
Algo assim faria:
xargs cat <filenames.txt
O xargs
programa lê sua entrada padrão e, para cada linha de entrada, executa o cat
programa 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
"foreach" não é o nome do bash. É simplesmente "para". Você pode fazer coisas em uma linha apenas como:
for fn in `cat filenames.txt`; do cat "$fn"; done
Referência: http://www.cyberciti.biz/faq/linux-unix-bash-for-loop-one-line-command/
Aqui está um while
loop:
while read filename
do
echo "Printing: $filename"
cat "$filename"
done < filenames.txt
read
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 %"
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> _