web-dev-qa-db-fra.com

Bash foreach loop

J'ai une entrée (disons un fichier). Sur chaque ligne, il y a un nom de fichier. Comment puis-je lire ce fichier et afficher le contenu de chaque fichier?.

146
danidacar

Quelque chose comme ça ferait:

xargs cat <filenames.txt

Le programme xargs lit son entrée standard et, pour chaque ligne d'entrée, exécute le programme cat avec les lignes d'entrée en tant qu'argument (s).

Si vous voulez vraiment faire cela en boucle, vous pouvez:

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

"foreach" n'est pas le nom de bash. C'est simplement "pour". Vous pouvez faire les choses en une seule ligne comme:

for fn in `cat filenames.txt`; do cat "$fn"; done

Référence: http://www.cyberciti.biz/faq/linux-unix-bash-for-loop-one-line-command/

41
Tom K. C. Chiu

Voici une boucle while:

while read filename
do
    echo "Printing: $filename"
    cat "$filename"
done < filenames.txt
17
dogbane
xargs --arg-file inputfile cat

Cela produira le nom du fichier suivi du contenu du fichier:

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

Vous voudrez probablement gérer les espaces dans vos noms de fichiers, aussi odieux qu'ils soient :-)

Donc, je choisirais initialement quelque chose comme:

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> _
4
paxdiablo
cat `cat filenames.txt`

va faire l'affaire

3
Alan Dyke