2010-11-12 11 views
108

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?Bash foreach loop

Respuesta

178

Algo como esto haría:

xargs cat <filenames.txt 

El programa xargs lee la entrada estándar, y para cada línea de entrada se ejecuta el programa cat con las líneas de entrada como argumento (s).

Si realmente quiere hacer esto en un bucle, puede:

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

es probable que desee para manejar espacios en los nombres de archivo, aberrante pesar de que son :-)

Así

optaría inicialmente para 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> _ 
12

Aquí es un bucle while:

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

Esto debería ser mejor enfoque. Puede usar la opción '-r' y '-d' con 'leer' – sjsam

4
xargs --arg-file inputfile cat 

Esta es la salida del nombre de archivo seguido por el contenido del archivo:

xargs --arg-file inputfile -I % sh -c "echo %; cat %" 
3
cat `cat filenames.txt` 

hará el truco