UNIX: Объединение файлов с разными расширениями в один файл

UNIX: Объединение файлов с разными расширениями в один файл

Например: в моем каталоге /temp есть 100 файлов. 50 из них имеют расширение .msg и 50 — .xml.

/temp/test1.xml
/temp/test2.xml
/temp/test3.xml
.........
/temp/test49.xml
/temp/test50.xml

и

/temp/test1.msg
/temp/test2.msg
/temp/test3.msg
.........
/temp/test49.msg
/temp/test50.msg

В текстовом файле я хотел бы вывести комбинацию содержимого файлов .xml и .msg один за другим. Например, выходной файл должен выглядеть так:

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

в этом каталоге /temp всегда будет равное количество файлов .msg и .xml. Кроме того, можно ли будет показать путь или имя файла перед содержимым в выходном файле? например:

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

Я попробовал простую трубу для файла

cat * > text.txt

но это не даёт нужного результата. В выходном файле сначала перечисляется содержимое всех файлов *.xml, а затем файлов *.msg.

Пожалуйста помогите.

решение1

for f in *xml ; do
  cat "$f" "${f/.xml/.msg}"
done > OUTPUTFILE

Может подойти, если вы используете bashоболочку. В противном случае (другие оболочки POSIX) используйте: cat "$f" "${f%.xml}.msg"вместо catстроки выше.

решение2

В подобных ситуациях часто имеет смысл действовать следующим образом:

  1. Перечислите все файлы в текстовом файле:

    $ ls > files
    
  2. Отредактируйте текстовый файл, чтобы удалить ненужные файлы и расположить оставшиеся в нужном вам порядке.

  3. Затем просто сделайте это (при условии, что в именах файлов нет пробелов или странных символов):

    $ cat $(cat files) > bigfile
    

Разновидностью этого подхода является преобразование текстового файла в одну большую команду:

file1
file2
file with spaces 3
...
filen

к:

cat \
file1 \
file2 \
"file with spaces 3" \
... \
filen \
> bigfile

Затем просто используйте файл как скрипт:

$ . ./files

Пробел и обратную косую черту можно добавить к каждой строке буфера с viпомощью :%s/$/ \\/.

решение3

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

решение4

Если это обычная последовательность, то можно сделать так:

в баше:

for ITER in {1..50}
do
    cat test${ITER}.xml
    cat test${ITER}.msg
done > test.txt

или если у вас есть утилитаseq

for ITER in $(seq 1 50)
do
    cat test${ITER}.xml
    cat test${ITER}.msg
done > test.txt

Связанный контент