199 votes

Bash boucle foreach

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 chacun d'eux.

272voto

Greg Hewgill Points 356191

Quelque chose comme ceci:

xargs cat <filenames.txt

L' xargs programme lit son entrée standard, et pour chaque ligne d'entrée exécute l' cat programme avec les lignes d'entrée comme argument(s).

Si vous voulez vraiment faire cela dans une boucle, vous pouvez:

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

53voto

Tom K. C. Chiu Points 21

"foreach" n'est pas le nom pour bash. Il est tout simplement "pour". Vous pouvez faire des choses en une seule ligne comme:

for fn in

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

23voto

dogbane Points 85749

Voici une while boucle:

while read filename
do
    echo "Printing: $filename"
    cat "$filename"
done < filenames.txt

5voto

Dennis Williamson Points 105818
xargs --arg-file inputfile cat

Ceci affichera le nom de fichier suivi par le contenu du fichier:

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

4voto

paxdiablo Points 341644

Vous aurez probablement envie de gérer les espaces dans les noms de fichier, odieuse bien qu'ils soient :-)

Je voudrais donc opter d'abord pour 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> _

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X