Como juntar arquivos de texto?

21

Guardei muitos documentos como txt. Eu quero imprimi-los juntos então primeiro eu os quero juntos em um único arquivo. A ordem não importa neste caso.

Eu quero uma solução que não envolva digitar os nomes dos arquivos a serem mesclados, mas um que apenas mescle todos os arquivos txt dentro da pasta.

Posso fazer isso com um comando ou alguma GUI?

Eu procurei aqui . Não sei como usar join .

    
por cipricus 02.02.2013 / 14:04

8 respostas

42

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

Exemplo com apenas dois arquivos (você pode ter muito 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 globalização de conchas (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 de cat e redirecionamento de saída - é apenas Bash fornecendo todos os arquivos como argumentos para cat .

Tipos de arquivo

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

Ordem de adesão

Como phoibos apontou , a globalização da concha resultará em ordem alfabética de nomes de arquivos. É assim que o Bash e o shell globbing funcionam.

Adendo sobre input file is output file error

Quando o padrão dos arquivos de entrada corresponder ao mesmo arquivo da saída, isso causará um erro. É um recurso de segurança. Exemplo: cat *.txt > out.txt executado na 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 *.txt com o arquivo de saída output.out não colidirá.
  • Trabalhe em diretórios diferentes. No exemplo acima, usei um diretório input-files-dir separado para colocar todos os arquivos e enviá-los para o diretório de trabalho atual. Isso torna impossível obter esse erro.
por gertvdijk 02.02.2013 / 14:14
12

Uma maneira simples de fazer isso é usar cat:

cat file1 file2 > joined_file

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

    
por Jorge Suárez de Lis 02.02.2013 / 14:15
5

Faça isso com um simples loop:

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

>> é anexado ao arquivo.

Nota: Se por algum motivo você tiver que executar o comando novamente, você terá que remover complete.txt , caso contrário você escreveria o arquivo para si mesmo, o que não funciona.

    
por phoibos 02.02.2013 / 14:33
4

Se todos os arquivos que você deseja combinar terminarem em .txt , simplifique:

cat *.txt > combined.txt

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

cat * > combined.txt

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

Se você quiser selecionar alguns arquivos no diretório e não em outros, é melhor que os nomes dos arquivos permitam distinguir quais deles você deseja. Se não, você pode ficar chique com find . Mas duvido que você precise ir tão longe.

    
por alexis 02.02.2013 / 20:57
4

Script de ação personalizada do Thunar escrito por cipricus também inspirado me para escrever um script Nautilus semelhante e pensei que poderia ser útil para outras pessoas que olharem para este Q & amp; A para referência sobre este 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"
    
por Sadi 07.02.2013 / 11:47
2

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

Nem todos eles são utilizáveis ​​desta forma, mas alguns são.

Eu achei que o mais interessante seria poder fundir os arquivos selecionados no menu de contexto do Thunar .

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

   cat %N > JoinedFile

Apenas os arquivos selecionados serão unidos. Restringir condições de aparência a arquivos de texto.

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

Aceitei gertvdijk 's answer como definitivo. Não só foi a ocasião para o comentário de Sadi, mas parece ser de maior valor para os outros, fornecendo uma solução bem argumentada e completa (embora um pouco acima das minhas habilidades de leitura de CLI).

    
por cipricus 02.02.2013 / 19:38
2

Você pode tentar o comando find também,

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

Ele encontra .txt arquivos dentro do diretório atual e executa o comando cat em cada arquivo fundado. Finalmente, toda a saída foi redirecionada para o nome do arquivo file (criado dentro da própria corrente diretamente).

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.
    
por Avinash Raj 13.06.2014 / 19:32
-2

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

    
por StackMan 17.05.2013 / 06:12