Например: в моем каталоге /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
В подобных ситуациях часто имеет смысл действовать следующим образом:
Перечислите все файлы в текстовом файле:
$ ls > files
Отредактируйте текстовый файл, чтобы удалить ненужные файлы и расположить оставшиеся в нужном вам порядке.
Затем просто сделайте это (при условии, что в именах файлов нет пробелов или странных символов):
$ 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