Por ejemplo: en mi directorio /temp tengo 100 archivos... 50 con la extensión .msg y 50 con .xml.
/temp/test1.xml
/temp/test2.xml
/temp/test3.xml
.........
/temp/test49.xml
/temp/test50.xml
y
/temp/test1.msg
/temp/test2.msg
/temp/test3.msg
.........
/temp/test49.msg
/temp/test50.msg
En un archivo de texto, me gustaría generar una combinación de los contenidos de los archivos .xml y .msg, uno tras otro. Por ejemplo, el archivo de salida debería verse así:
content of test1.xml
content of test1.msg
content of test2.xml
content of test2.msg
content of test3.xml
content of test3.msg
............
content of test49.xml
content of test49.msg
content of test50.xml
content of test50.msg
en este directorio /temp siempre habrá una cantidad igual de archivos .msg y .xml. Además, ¿será posible mostrar la ruta o el nombre del archivo antes del contenido en el archivo de salida? Por ejemplo:
text1.xml: content of test1.xml
text1.msg: content of test1.msg
text2.xml: content of test2.xml
text2.msg: content of test2.msg
text3.xml: content of test3.xml
text3.msg: content of test3.msg
....................
text49.xml: content of test49.xml
text49.msg: content of test49.msg
text50.xml: content of test50.xml
text50.msg: content of test50.msg
He probado una tubería simple para archivar.
cat * > text.txt
pero esto no da el resultado requerido. En el archivo de salida, primero enumera el contenido de todos los archivos *.xml y luego los archivos *.msg.
Por favor asiste.
Respuesta1
for f in *xml ; do
cat "$f" "${f/.xml/.msg}"
done > OUTPUTFILE
Podría funcionar para usted, si está utilizando el bash
shell. De lo contrario (otros shells POSIX) utilice: cat "$f" "${f%.xml}.msg"
en lugar de la línea anterior cat
.
Respuesta2
En este tipo de situaciones, suele tener sentido proceder de la siguiente manera:
Enumere todos los archivos en un archivo de texto:
$ ls > files
Edite el archivo de texto para eliminar archivos no deseados y organizar los restantes en el orden exacto que desee.
Luego simplemente haga esto (asumiendo que ninguno de los archivos tenga espacios o caracteres divertidos en sus nombres):
$ cat $(cat files) > bigfile
Una variación de este enfoque es convertir el archivo de texto en un comando grande, desde
file1
file2
file with spaces 3
...
filen
a:
cat \
file1 \
file2 \
"file with spaces 3" \
... \
filen \
> bigfile
Luego simplemente obtenga el archivo como un script:
$ . ./files
Se puede agregar un espacio y una barra invertida a cada línea del búfer vi
usando :%s/$/ \\/
.
Respuesta3
for i in {1..50}; do
echo "text$i.xml: `cat text$i.xml`" >> output.txt
echo "text$i.msg: `cat text$i.msg`" >> output.txt
done
Respuesta4
Si es una secuencia normal puedes hacer esto:
en fiesta:
for ITER in {1..50}
do
cat test${ITER}.xml
cat test${ITER}.msg
done > test.txt
o si tienes la utilidadseq
for ITER in $(seq 1 50)
do
cat test${ITER}.xml
cat test${ITER}.msg
done > test.txt