Como juntar arquivos de texto?

21

Eu salvei muitos documentos como txt. Quero imprimi-los juntos, então primeiro os quero juntos em um único arquivo. O pedido não importa neste caso.

Quero uma solução que não envolva a digitação dos nomes dos arquivos a serem mesclados, mas que apenas mesclará todos os arquivos txt na pasta.

Posso fazer isso com um comando ou alguma GUI?


Olhei aqui . Não sei como usar join.


fonte

Respostas:

43

Use catcom o redirecionamento de saída. Sintaxe: cat file [file] [[file] ...] > joined-file.

Exemplo com apenas dois arquivos (você pode ter muitos mais):

$ echo "some text in a file" > file1
$ echo "another file with some text" > file2
$ cat file1 file2 > mergedfiles
$ cat mergedfiles
some text in a file
another file with some text

Caso você tenha "muitos documentos", faça uso de globbing de shell (padrões):

cat input-files-dir/* > joined-file

Isso unirá todos os arquivos desse diretório ao diretório atual (impedindo que ele corresponda ao próprio arquivo de saída). É totalmente independente do uso cate redirecionamento de saída - é apenas o Bash fornecendo todos os arquivos como argumentos cat.


Tipos de arquivo

Ele apenas cola (une) arquivos como faria com papel e fita. Ele não se importa com o formato de arquivo real capaz de lidar com isso. Ele funcionará para arquivos de texto, mas não para PDFs, ODTs etc. Bem, ele será colado, mas não é mais um PDF / ODT válido.


Ordem de adesão

Como phoibos apontou, o globbing do shell resultará em ordem alfabética dos nomes dos arquivos. É assim que o Bash e o shell globbing funcionam.


Adendo sobre input file is output fileerro

Quando o padrão dos arquivos de entrada corresponder ao mesmo arquivo que está sendo produzido, isso causará um erro. É um recurso de segurança. Exemplo: cat *.txt > out.txtexecutar a segunda vez causará isso.

O que você pode fazer sobre isso:

  • Escolha um padrão mais específico para corresponder aos arquivos de entrada reais, não correspondendo ao nome da saída. Exemplo: o padrão dos arquivos de entrada *.txtcom o arquivo de saída output.outnão colidirá.
  • Trabalhe em diretórios diferentes. No exemplo acima, usei um input-files-dirdiretório separado para colocar todos os arquivos e enviar para o diretório de trabalho atual. Isso torna impossível obter esse erro.
gertvdijk
fonte
@cipricus Sim, mas isso é muito básico no globbing (padrões). Experimente seus padrões usando lsapenas para listar as correspondências. Por exemplo, ls *.txtpara ver o que está sendo correspondido.
gertvdijk
2
@cipricus Que tal cat * .txt> JoinFile.txt?
Sadi
1
Esta é mais senso comum, na verdade, gato primeiro pega todos os arquivos .txt e segundo ele se junta a eles e terceira ele cria um novo arquivo .txt que não pode ser pego na primeira etapa ;-)
Sadi
1
@cipricus Apenas junta arquivos. Como você usaria pedaços de papel com cola e fita adesiva! A maioria dos formatos de arquivo "documentos", como PDF, compactados não permite isso. Use um editor de PDF. De qualquer forma, sua pergunta era sobre arquivos de texto .
224132 Gertvdijk #
1
Entendo perfeitamente que o método que você sugere (criar um subdiretório, mover arquivos e depois ingressar) pode ser a melhor maneira em alguns casos. Mas se quisermos unir todos os arquivos de texto (todos com extensão .txt) no diretório atual, cat * .txt> JoinFile.txt faz o trabalho perfeitamente. Acabei de o testar por curiosidade e funciona, e parece que o cipricus também encontrou o mesmo resultado. (E o sistema começou a queixar-se que não deveríamos estar conversando aqui, caso contrário, gostaria de perguntar se você pode ensinar este novato como você pode usar formatação no esses comentários sem uma barra de ferramentas ;-)
Sadi
12

Uma maneira simples de fazer isso é usando cat:

cat file1 file2 > joined_file

Se você apenas emitir, cat file1 file2verá os dois arquivos na saída padrão. Ao usar >, você está apenas redirecionando a saída padrão para um arquivo. Isso funcionará também com outros comandos.

Jorge Suárez de Lis
fonte
Por favor, leia a pergunta. Você está dizendo para especificar nomes de arquivos individuais, o que o OP especificamente não queria fazer!
Sri
2
Isso não estava na pergunta original. Não atualizei minha resposta desde que apareceram respostas mais completas.
Jorge Suárez de Lis
@ JorgeSuárezdeLis Embora esta resposta não ajude diretamente o OP com sua pergunta, observe que esta resposta provavelmente ajudará alguém que possui apenas alguns arquivos que gostaria de mesclar. (oh ei, como eu! obrigado! ^ - ^) +1
Souta 07/02
@ JorgeSuárezdeLis Indeed. Você respondeu a revisão 2 da pergunta perfeitamente bem. Alguns minutos depois, a revisão 3 mudou os requisitos de respostas.
9443
5

Faça isso com um loop simples:

for i in *.txt; do cat "$i" >> complete.txt; done

>> anexa ao arquivo.

Nota: Se, por algum motivo, você precisar executar o comando novamente, precisará removê-lo complete.txt; caso contrário, você gravará o arquivo nele mesmo, o que não funcionará.

phoibos
fonte
5
Isso também funcionará, mas não vejo a necessidade de um loop for se você puder usar argumentos para cat.
gertvdijk
1
Sim, você está certo, é claro. Só não tenho certeza sobre a ordem do senhor usando cat *.txt. O loop for deve ser classificado.
Phoibos
1
Acontece que * é garantido em ordem alfabética .
Phoibos
Sim, é exatamente a mesma concha brilhando. Não importa se você o usa forno Bash ou em qualquer outro lugar.
precisa saber é o seguinte
4

Se os arquivos que você deseja combinar terminarem .txt, mantenha-o simples:

cat *.txt > combined.txt

Se o diretório contiver apenas arquivos de texto, também é simples:

cat * > combined.txt

(Observe que, uma vez criado combined.txt, fazê-lo novamente incluiria na expansão de *, levando a um comportamento estranho).

Se você deseja selecionar alguns arquivos no diretório e não outros, é melhor que os nomes de arquivos permitam distinguir quais você deseja. Caso contrário, você pode se interessar find. Mas duvido que você precise ir tão longe.

alexis
fonte
thnx. se você olhar os comentários para a resposta aceita, Sadi sugeriu exatamente isso em um comentário. se sua resposta tivesse sido a primeira, teria sido o que eu preciso. vejam o meu também: acrescentou que no menu personalizado
Obrigado pelo feedback. Sim, eu vê-lo agora, foi um pouco obscurecida ...
alexis
4

O script de ação personalizado da Thunar, escrito por cipricus, também me inspirou a escrever um script semelhante do Nautilus, e achei que poderia ser útil para outras pessoas que consultam estas perguntas e respostas para obter referências sobre esse assunto. Então aqui está:

#!/bin/sh
#Nautilus Script to join selected text files in a single file and open the joined file with default text editor
#
IFS=$'\n'
FILENAME="JoinedFile_$(date +%Y-%m-%d-%H-%M-%S).txt"
cat "$@" > "$FILENAME"
xdg-open "$FILENAME"
Sadi
fonte
@ David Foerster Obrigado pela edição. Não tive problemas com a versão antiga (com meus casos de teste limitados) e também não vejo nenhum problema com esta versão aprimorada. Desculpe se causei algum inconveniente devido a uma falha na versão anterior.
Sadi
Não era falho, mas continha um loop desnecessário, o que tornava o código mais difícil de entender.
precisa
2

Este é um complemento e uma variação para as outras respostas, relacionadas a colocar essas soluções em ação nas ações dos costumes de Thunar.

Nem todos eles são utilizáveis ​​dessa maneira, mas alguns são.

Eu pensei que o mais interessante seria poder mesclar arquivos selecionados no menu de contexto do Thunar .

Esta é uma variação do que foi sugerido por Sadi em um comentário para gertvdijk 's resposta :

   cat %N > JoinedFile

Somente arquivos selecionados serão ingressados. Restrinja as condições de aparência aos arquivos de texto.

insira a descrição da imagem aqui

insira a descrição da imagem aqui


Um agradecimento especial a Sadi, cujo comentário me forneceu a solução mais clara e correta para o meu problema.

Eu aceitei gertvdijk 's resposta como definitiva. Não foi apenas a ocasião para o comentário de Sadi, mas parece ter mais valor para os outros, fornecendo uma solução bem argumentada e completa (embora um pouco acima das minhas habilidades de leitura do CLI).

Comunidade
fonte
2

Você pode tentar o findcomando também,

find . -name "*.txt" -type f -exec cat {} + > file

Ele encontra .txtarquivos dentro do diretório atual e executa o catcomando em cada arquivo encontrado. Finalmente, toda a saída foi redirecionada para o nome do arquivo file(criado diretamente dentro da corrente).

Explicação:

.                  # current directory

-name              # helps to find only .txt files.

-type f            # Only files

-exec cat {} +     # helps to run cat command on the founded .txt files.

>                  # Output redirection operator

file               # to store final output.
Avinash Raj
fonte
-2

Você também pode usar um utilitário on-line, como merge-files-online.com

StackMan
fonte