Quero copiar o conteúdo de cinco arquivos para um arquivo como está. Eu tentei fazê-lo usando cp para cada arquivo. Mas isso substitui o conteúdo copiado do arquivo anterior. Eu também tentei
paste -d "\n" 1.txt 0.txt
e não funcionou.
Quero que meu script adicione a nova linha no final de cada arquivo de texto.
por exemplo. Arquivos 1.txt, 2.txt, 3.txt. Coloque conteúdo de 1,2,3 em 0.txt
Como eu faço isso ?
Respostas:
Você precisa do
cat
comando (abreviação de concatenar), com redirecionamento de shell (>
) no seu arquivo de saídafonte
>>
para anexar um arquivo para outro, onde>
substitui o arquivo de saída com o que está direcionado para ele. Quanto à nova linha, há uma nova linha como o primeiro caractere no arquivo1.txt
? Você pode descobrir usandood -c
e ver se o primeiro caractere é a\n
.{...}
para correspondência de nome de arquivo, então talvez as aspas tenham atrapalhado um pouco o seu script? Eu sempre tento trabalhar com coisas como essa usandols
um shell. Quando eu recebo o comando corretamente, apenas recorto e colo em um script como está. Você também pode achar a-x
opção útil em seus scripts - ela fará eco dos comandos expandidos no script antes da execução.Outra opção, para aqueles que ainda se deparam com este post como eu, é usar
find -exec
:No meu caso, eu precisava de uma opção mais robusta que visse vários subdiretórios, então optei por usá-lo
find
. Dividindo:Procure no diretório de trabalho atual.
Interessado apenas em arquivos, não em diretórios etc.
Reduzir o resultado definido pelo nome
Execute o comando cat para cada resultado. "+" significa que apenas 1 instância
cat
é gerada (thx @gniourf_gniourf)Conforme explicado em outras respostas, anexe o conteúdo do catálogo ao final de um arquivo de saída.
fonte
*.txt
deve ser citado (caso contrário, todo ofind
comando, como está escrito, é inútil). Outra falha vem de um grande equívoco: o comando que é executado não écat >> 0.txt {}
, mascat {}
. Seu comando é de fato equivalente a{ find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt
(adicionei agrupamento para que você perceba o que realmente está acontecendo). Outra falha éfind
encontrar o arquivo0.txt
ecat
reclamará dizendo que o arquivo de entrada é um arquivo de saída .>> output.file
no final do seu comando, para não induzir ninguém (inclusive você) a pensar quefind
será executadocat {} >> output.file
para cada arquivo encontrado.-exec cat {} +
vez de-exec cat {} \;
, para que apenas uma instância decat
seja gerada com vários argumentos (+
é especificado pelo POSIX ).find . -type f -exec cat {} + >> outputfile.txt
e não consegui descobrir por que meu arquivo de saída não parava de crescer nos shows, mesmo que o diretório tivesse apenas 50 megas. Foi porque eu continuei anexando outputfile.txt a si mesmo! Portanto, certifique-se de nomear esse arquivo corretamente ou colocá-lo em outro diretório completamente para evitar isso.se você tem um certo tipo de saída, faça algo assim
fonte
file_1
,,file_2
…file_11
, Devido à ordem natural de classificação dos arquivos.Se todos os seus arquivos estiverem em um único diretório, você pode simplesmente fazer
cat * > 0.txt
Os arquivos 1.txt, 2.txt, .. entrarão em 0.txt
fonte
file_1
,,file_2
…file_11
, Devido à ordem natural de classificação dos arquivos.Encontrei esta página porque precisava juntar arquivos 952 em um. Achei que isso funcionaria muito melhor se você tiver muitos arquivos. Isso fará um loop para quantos números você precisar e usará cada um deles >> para adicionar no final de 0.txt.
fonte
Se todos os seus arquivos tiverem nomes semelhantes, você pode simplesmente fazer:
fonte
Outra opção é
sed
:Ou...
Ou...
Ou sem redirecionamento ...
Observe que a última linha também escreve
merge.txt
(nãowmerge.txt
!). Você pode usarw"merge.txt"
para evitar confusão com o nome do arquivo e-n
para saída silenciosa.Obviamente, você também pode reduzir a lista de arquivos com caracteres curinga. Por exemplo, no caso de arquivos numerados, como nos exemplos acima, você pode especificar o intervalo com chaves desta maneira:
fonte
se seus arquivos contiverem cabeçalhos e você desejar removê-los no arquivo de saída, poderá usar:
fonte
Se o arquivo original contiver caracteres não imprimíveis, eles serão perdidos ao usar o comando cat. Usando 'cat -v', os não imprimíveis serão convertidos em cadeias de caracteres visíveis, mas o arquivo de saída ainda não conteria os caracteres reais não imprimíveis no arquivo original. Com um pequeno número de arquivos, uma alternativa pode ser abrir o primeiro arquivo em um editor (por exemplo, vim) que lida com caracteres não imprimíveis. Em seguida, manobra para a parte inferior do arquivo e digite ": r second_file_name". Isso puxará o segundo arquivo, incluindo caracteres não imprimíveis. O mesmo poderia ser feito para arquivos adicionais. Quando todos os arquivos tiverem sido lidos, digite ": w". O resultado final é que o primeiro arquivo agora conterá o que fez originalmente, além do conteúdo dos arquivos que foram lidos.
fonte
Se você deseja anexar o conteúdo de 3 arquivos em um arquivo, o seguinte comando será uma boa opção:
Ele combinará o conteúdo de todos os arquivos no arquivo4, lançando a saída do console para
/dev/null
.fonte