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.

nascar
la source

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
Greg Hewgill
la source
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
dogbane
la source
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
5
xargs --arg-file inputfile cat

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

xargs --arg-file inputfile -I % sh -c "echo %; cat %"
Suspendu jusqu'à nouvel ordre.
la source
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> _
paxdiablo
la source
3
cat `cat filenames.txt`

fera l'affaire

Alan Dyke
la source
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)

Israël P
la source