Boucle Bash foreach


158

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.

Réponses:


234

Quelque chose comme ça ferait:

xargs cat <filenames.txt

Le xargsprogramme lit son entrée standard, et pour chaque ligne d'entrée exécute le catprogramme avec les lignes d'entrée comme 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

3
Les deux ne fonctionnent pas lorsque les noms de fichiers contiennent des espaces.
mivk

@mivk vous pouvez échapper à l'espace
Toochka


18

Voici une whileboucle:

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

Cela devrait être la meilleure approche. Vous devez utiliser l'option '-r' & '-d' avecread
sjsam

1
Contrairement à la plupart des autres réponses ici, celle-ci fonctionne réellement, même lorsque les noms de fichiers contiennent des espaces.
mivk


4

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

J'opterais donc au départ 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> _


0

S'ils ont tous la même extension (par exemple .jpg), vous pouvez utiliser ceci:

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

(Cette solution fonctionne également si le nom de fichier comporte des espaces)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.