2012-07-23 7 views
6

Tengo un archivo de texto que contiene una lista de archivos. Quiero cat sus contenidos juntos. ¿Cuál es la mejor manera de hacer esto? Estaba haciendo algo como esto, pero parece demasiado complejo:Bash: cat archivos múltiples de la lista de archivos

let count=0 
while read -r LINE 
do 
    [[ "$line" =~ ^#.*$ ]] && continue 
    if [ $count -ne 0 ] ; then 
     file="$LINE" 
     while read PLINE 
     do 
      echo $PLINE | cat - myfilejs > /tmp/out && mv /tmp/out myfile.js 
     done < $file 
    fi 
    let count++ 
done < tmp 

Yo estaba saltando líneas de comentarios y se produzcan problemas. Tiene que haber una mejor forma de hacerlo, sin dos bucles. ¡Gracias!

+0

subconjunto: http://stackoverflow.com/questions/864316/how-to-pipe-list-of-files -returned-by-find-command-to-cat-to-view-all-the-files –

Respuesta

9

O en un simple comando de

cat $(grep -v '^#' files) > output 
+0

@chepner que parece ser lo que asker está haciendo también. – kojiro

+2

@CharlesDuffy Dudo que para esta aplicación en particular uno realmente use nombres de archivos separados por espacios. Mejor propongo una mejora, ya que, en mi opinión, un oneliner es una solución más agradable que un script de 8 líneas. ¿Estás usando nombres de archivos con espacios en blanco alguna vez? – Bernhard

+3

@Bernhard No tome esto de la manera incorrecta, pero * por supuesto * tratamos nombres de archivos con espacios en blanco todo el tiempo. Apoyamos a los usuarios que no conocen la diferencia, y ¿por qué deberían hacerlo si es bastante fácil escribir un script que pueda manejarla? – kojiro

3
{ 
    while read file 
    do 
    #process comments here with continue 
    cat "$file" 
    done 
} <tmp> newfile 
+0

He arreglado el uso de la variable 'file'. ¿Hay una necesidad real de llaves? – chepner

+0

@chepner: No, ya que el uso de la variable no es ambiguo. –

1

¿Qué tal cat $(cat listoffiles) | grep -v "^#"?

+0

¿No quieres decir 'cat $ (grep -v '^ #' listoffiles)'? ¿Qué hay de los problemas de espacio en blanco? – kojiro

+0

OK, siempre que ninguno de los nombres de archivo contenga espacios. – chepner

+0

@chepner O siempre que los espacios en blanco se escapen en 'listoffiles', o nombres citados. – loxaxs

5
#!/bin/bash 

files=() 
while read; do 
    case "$REPLY" in 
     \#*|'') continue;; 
     *) files+=("$REPLY");; 
    esac 
done < input 
cat "${files[@]}" 

Lo mejor acerca de este enfoque es que:

  1. El único comando externo, cat, solamente es ejecutado una vez.
  2. Es bastante cuidadoso mantener espacios en blanco significativos para cualquier línea/nombre de archivo dado.
+0

En comparación con esta respuesta: cat $ (grep -v '^ #' archivos)> salida ¿Hay alguna ventaja obvia? – user1470511

+3

@ user1470511 Sí, la respuesta 'grep' puede romperse si alguno de los nombres de archivo tiene espacios en blanco. – kojiro

0

terminé con esto:

sed '/^$/d;/^#/d;s/^/cat "/;s/$/";/' files | sh > output 

Pasos:

  1. sed elimina las líneas en blanco & comentadas líneas de archivos.

  2. sed luego envuelve cada línea en cat " y ";.

  3. Script es entonces canalizado a sh con y en de salida.

+0

Olvidé mencionar que esto maneja crudamente espacios en blanco envolviendo los nombres de archivo entre comillas. – sh3rmy

0

xargs

printf 'a\nb\n' > files 
printf '12\n3\n' > a 
printf '4\n56\n' > b 
xargs cat < files 

Salida:

12 
3 
4 
56 
Cuestiones relacionadas