Por exemplo: No meu diretório /temp tenho 100 arquivos. 50 com extensão .msg e 50 com .xml.
/temp/test1.xml
/temp/test2.xml
/temp/test3.xml
.........
/temp/test49.xml
/temp/test50.xml
e
/temp/test1.msg
/temp/test2.msg
/temp/test3.msg
.........
/temp/test49.msg
/temp/test50.msg
Em um arquivo de texto, gostaria de gerar uma combinação do conteúdo dos arquivos .xml e .msg, um após o outro. Por exemplo, o arquivo de saída deve ser semelhante a:
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
neste diretório /temp sempre haverá um número igual de arquivos .msg e .xml. Além disso, será possível mostrar o caminho ou o nome do arquivo antes do conteúdo do arquivo de saída? por exemplo:
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
Eu tentei um pipe simples para arquivar
cat * > text.txt
mas isso não dá o resultado necessário. No arquivo de saída, ele primeiro lista o conteúdo de todos os arquivos *.xml e depois dos arquivos *.msg.
Por favor ajude.
Responder1
for f in *xml ; do
cat "$f" "${f/.xml/.msg}"
done > OUTPUTFILE
Pode funcionar para você, se você estiver usando o bash
shell. Caso contrário (outros shells POSIX) use: cat "$f" "${f%.xml}.msg"
em vez da cat
linha acima.
Responder2
Neste tipo de situações, muitas vezes faz sentido proceder da seguinte forma:
Liste todos os arquivos em um arquivo de texto:
$ ls > files
Edite o arquivo de texto para remover arquivos indesejados e organizar os restantes na ordem exata desejada.
Depois é só fazer isso (supondo que nenhum dos arquivos tenha espaços ou caracteres engraçados em seus nomes):
$ cat $(cat files) > bigfile
Uma variação desta abordagem é transformar o arquivo de texto em um grande comando, de
file1
file2
file with spaces 3
...
filen
para:
cat \
file1 \
file2 \
"file with spaces 3" \
... \
filen \
> bigfile
Em seguida, basta fornecer o arquivo como um script:
$ . ./files
Um espaço e uma barra invertida podem ser adicionados a cada linha no buffer vi
usando :%s/$/ \\/
.
Responder3
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
Responder4
Se for uma sequência normal, você pode fazer isso:
na festa:
for ITER in {1..50}
do
cat test${ITER}.xml
cat test${ITER}.msg
done > test.txt
ou se você tiver o utilitárioseq
for ITER in $(seq 1 50)
do
cat test${ITER}.xml
cat test${ITER}.msg
done > test.txt