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?

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

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

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 %"

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> _


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)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.