Bash foreach loop

158

Tengo una entrada (digamos un archivo). En cada línea hay un nombre de archivo. ¿Cómo puedo leer este archivo y mostrar el contenido de cada uno?

danidacar
fuente

Respuestas:

234

Algo como esto haría:

xargs cat <filenames.txt

El xargsprograma lee su entrada estándar, y para cada línea de entrada ejecuta el catprograma con las líneas de entrada como argumento (s).

Si realmente quieres hacer esto en un bucle, puedes:

for fn in `cat filenames.txt`; do
    echo "the next file is $fn"
    cat $fn
done
Greg Hewgill
fuente
3
Ambos no funcionan cuando los nombres de archivo contienen espacios.
mivk
@mivk puedes escapar del espacio
Toochka
18

Aquí hay un whilebucle:

while read filename
do
    echo "Printing: $filename"
    cat "$filename"
done < filenames.txt
dogbane
fuente
Este debería ser el mejor enfoque. Puede usar la opción '-r' y '-d' conread
sjsam
1
A diferencia de la mayoría de las otras respuestas aquí, esta realmente funciona, incluso cuando los nombres de los archivos contienen espacios.
mivk
5
xargs --arg-file inputfile cat

Esto generará el nombre del archivo seguido del contenido del archivo:

xargs --arg-file inputfile -I % sh -c "echo %; cat %"
Pausado hasta nuevo aviso.
fuente
4

Probablemente quiera manejar espacios en los nombres de sus archivos, aunque sean abominables :-)

Entonces, inicialmente optaría 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> _
paxdiablo
fuente
3
cat `cat filenames.txt`

hará el truco

Alan Dyke
fuente
0

Si todos tienen la misma extensión (por ejemplo .jpg), puede usar esto:

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

(Esta solución también funciona si el nombre de archivo tiene espacios)

Israel P
fuente