Comando split: Dividindo e Juntando Arquivos Grandes

Comando split: Dividindo e Juntando Arquivos Grandes

E Se o Arquivo For Grande Demais?

Lina: Senpai, tentei copiar um arquivo de log de 5GB para um pendrive e apareceu "file too large"...
Veterano Linny: Esse e o trabalho do comando split. Ele corta um arquivo grande em pedacos pequenos que voce pode juntar novamente depois, exatamente como estavam. Vamos ver como funciona.

O Que Voce Vai Aprender

  • Como dividir um arquivo grande por tamanho, linhas ou quantidade de pedacos com split
  • Como juntar os pedacos de volta no arquivo original com cat
  • Como usar sufixos numerados (part_01 em vez de xaa)
  • Como verificar se o arquivo esta intacto apos dividir e juntar

1. O Que e o Comando split?

Conclusao: split quebra um arquivo em varios arquivos menores; concatena-los com cat restaura o original byte a byte.

Lina: Espera, "dividir" danifica o arquivo original?
Veterano Linny: Nao. O split apenas corta uma copia em pedacos; o original permanece intocado. E quando voce junta os pedacos na ordem, obtem o original de volta sem perder um unico byte.
Lina: Isso e tranquilizador. Quando eu usaria isso?
Veterano Linny: Quando voce precisa caber um arquivo em midia com limite de tamanho, transferir um arquivo enorme em partes, ou quebrar um log gigante em pedacos gerenciaveis. Vamos comecar com a forma mais simples.

Primeiro, crie um arquivo para praticar.

# Criar um arquivo dummy de 50MB
$ dd if=/dev/zero of=bigfile.dat bs=1M count=50
$ ls -lh bigfile.dat
-rw-r--r-- 1 user user 50M Jun  5 10:00 bigfile.dat

2. Como Dividir por Tamanho

Conclusao: Use split -b TAMANHO arquivo prefixo. -b 100M cria pedacos de 100MB, -b 10M cria pedacos de 10MB.

Lina: Deixa eu tentar cortar em pedacos de 10MB.
Veterano Linny: Use -b (de bytes). O part_ no final e o prefixo adicionado ao inicio de cada nome de arquivo de saida.
$ split -b 10M bigfile.dat part_
$ ls -lh part_*
-rw-r--r-- 1 user user 10M Jun  5 10:01 part_aa
-rw-r--r-- 1 user user 10M Jun  5 10:01 part_ab
-rw-r--r-- 1 user user 10M Jun  5 10:01 part_ac
-rw-r--r-- 1 user user 10M Jun  5 10:01 part_ad
-rw-r--r-- 1 user user 10M Jun  5 10:01 part_ae
Lina: Entao fica part_aa, part_ab... com as letras aumentando.
Veterano Linny: Isso. Se voce omitir o prefixo, fica xaa, xab... As unidades de tamanho sao K, M, G. Note que 10M significa 10x1024x1024 bytes, enquanto 10MB significa 10x1000x1000 bytes.

Guia pratico de tamanhos

  • split -b 700M -> cabe em um CD
  • split -b 100M -> tamanho facil para upload na nuvem
  • split -b 1G -> 1GB por pedaco

3. Como Dividir por Numero de Linhas

Conclusao: Para texto e logs, split -l LINHAS arquivo prefixo divide nos limites das linhas, para que nenhuma linha seja cortada ao meio.

Lina: E quanto a dividir um arquivo de log a cada 1000 linhas?
Veterano Linny: Use -l (de linhas). Dividir por tamanho pode cortar uma linha bem no meio, mas -l sempre quebra no limite da linha. Muito mais seguro para CSV e logs.
$ split -l 1000 access.log chunk_
$ wc -l chunk_*
   1000 chunk_aa
   1000 chunk_ab
    342 chunk_ac
   2342 total

A divisao por tamanho (-b) corta mecanicamente em um offset de bytes, entao em um arquivo de texto uma linha pode ser dividida entre dois pedacos. Quando o significado da linha importa, sempre use -l.

4. Como Dividir em um Numero Fixo de Pedacos

Conclusao: split -n QUANTIDADE arquivo prefixo divide o arquivo em exatamente essa quantidade de pedacos iguais.

Lina: As vezes nao me importo com "10MB cada" - so quero exatamente 5 pedacos.
Veterano Linny: Entao use -n (de numero). Ele divide o arquivo inteiro em 5 partes iguais, entao voce nao precisa calcular tamanhos.
$ split -n 5 bigfile.dat group_
$ ls -lh group_*
-rw-r--r-- 1 user user 10M Jun  5 10:05 group_aa
-rw-r--r-- 1 user user 10M Jun  5 10:05 group_ab
-rw-r--r-- 1 user user 10M Jun  5 10:05 group_ac
-rw-r--r-- 1 user user 10M Jun  5 10:05 group_ad
-rw-r--r-- 1 user user 10M Jun  5 10:05 group_ae

5. Como Juntar os Pedacos de Volta

Conclusao: Nenhum comando especial e necessario. cat prefixo* > arquivo_restaurado concatena os pedacos na ordem para reconstruir o original.

Lina: Eu dividi, mas como junto de volta? Existe um comando "join"?
Veterano Linny: Boa pergunta. Existe um comando join, mas ele serve para juntar colunas de tabelas - completamente diferente. Para remontar pedacos do split, voce usa cat.
Lina: O comando cat que exibe arquivos?
Veterano Linny: Sim. O cat tambem concatena multiplos arquivos na ordem. Redirecione com > para escrever o resultado em um arquivo, e pronto.
$ cat part_* > restored.dat
$ ls -lh restored.dat
-rw-r--r-- 1 user user 50M Jun  5 10:10 restored.dat

Atencao com a ordem. O curinga * em cat part_* expande em ordem alfabetica, entao part_aa -> part_ab -> ... fica correto. Mas se voce nomear arquivos com numeros simples como part_1, part_2, ... part_10, entao part_10 pode ser ordenado antes de part_2. Use a numeracao com zeros a esquerda da proxima secao para se manter seguro.

6. Como Usar Sufixos Numerados

Conclusao: -d gera sufixos numericos (00, 01...), -a define a quantidade de digitos, e --additional-suffix adiciona uma extensao.

Lina: Prefiro ter 01, 02 do que aa, ab - e mais claro.
Veterano Linny: Adicione -d (de digitos) para obter numeros. Defina a largura com -a, e voce pode ate adicionar uma extensao como .part com --additional-suffix.
$ split -b 10M -d -a 2 --additional-suffix=.part bigfile.dat backup_
$ ls backup_*
backup_00.part  backup_01.part  backup_02.part  backup_03.part  backup_04.part

Com numeros preenchidos com zeros (00, 01, ... 10, 11), cat backup_*.part > restored.dat sempre junta na ordem correta. Se voce espera mais de 100 pedacos, use -a 3 para tres digitos.

7. Como Verificar Se o Arquivo Esta Intacto

Conclusao: Compare os hashes sha256sum antes e depois. Valores iguais provam que o arquivo foi restaurado byte a byte.

Lina: Estou nervosa que o arquivo juntado nao seja realmente identico ao original...
Veterano Linny: Para isso serve o sha256sum. E uma especie de "impressao digital" calculada a partir do conteudo do arquivo. Se o arquivo original e o restaurado tiverem a mesma impressao digital, sao identicos. Tambem detecta corrupcao durante transferencia ou copia.
$ sha256sum bigfile.dat restored.dat
e3b0c44298fc1c149afbf4c8996fb924...  bigfile.dat
e3b0c44298fc1c149afbf4c8996fb924...  restored.dat
Lina: As strings longas da esquerda sao iguais! Que alivio.
Veterano Linny: Se fossem diferentes, significaria que a ordem de juncao estava errada ou que os dados foram corrompidos no transporte. Nesse caso, refaca a divisao.
Mini Exercicio (clique para abrir)

Crie um arquivo de 30MB chamado practice.dat, depois (1) divida-o em pedacos de 7MB, (2) junte-os com cat, e (3) confirme que o hash corresponde ao original.

Dica: dd if=/dev/zero of=practice.dat bs=1M count=30 -> split -b 7M practice.dat p_ -> cat p_* > joined.dat -> sha256sum practice.dat joined.dat

8. Armadilhas Comuns e Solucoes

Conclusao: A maioria dos problemas vem da ordem de juncao, confusao de unidades ou falta de espaco em disco. Verifique a capacidade e as unidades antes de dividir.

Sintoma Causa Solucao
Arquivo juntado esta corrompido Ordem de juncao errada Use -d com zeros e cat ...*
Mais/menos pedacos que o esperado M (1024) vs MB (1000) Use uma unidade consistentemente
No space left on device Dividir precisa de ~2x o espaco Verifique espaco livre com df -h primeiro
Linhas de texto cortadas ao meio Voce usou -b (bytes) Divida novamente com -l (linhas)

Nao faca isso

  • Deletar o original antes de testar a juncao
  • Pular a verificacao de hash
  • Iniciar uma divisao sem verificar o espaco livre

Resumo / Proximas Leituras