Linux / Comando split: dividir arquivos e conferir a restauração

split divide um arquivo em partes por quantidade de linhas ou por tamanho em bytes. Use -l para limitar linhas e -b para limitar bytes por parte; o arquivo de entrada permanece disponível. Para reconstruir o conteúdo, reúna todas as partes corretas na ordem original e confira o resultado.

No GNU split, a execução padrão usa 1000 linhas por parte e nomes como xaa, xab e xac: x é o prefixo padrão, seguido pelos sufixos gerados. Escolha uma pasta exclusiva para cada conjunto, porque arquivos de saída com o mesmo nome podem ser sobrescritos.

Sintaxe e preparação

split [opção...] [arquivo_de_entrada [prefixo_de_saída]]

A linha acima descreve a sintaxe e contém marcadores. Sem arquivo de entrada, ou com - nessa posição, split lê a entrada padrão. O prefixo faz parte do nome dos arquivos criados; ele não é uma extensão nem um nome de diretório a ser criado automaticamente. Confira split --version, split --help ou man split para a implementação instalada.

As operações abaixo foram conferidas com GNU split 8.32 no Bash do Git para Windows, em arquivos locais. Os exemplos de texto usam finais de linha LF; o arquivo binário da prática também contém bytes NUL e 0xff. Isso permite conferir a recomposição byte a byte sem depender da interpretação do conteúdo como texto.

Criar dados e dividir por 500 linhas

Execute o bloco inteiro no Bash, dentro de uma pasta onde possa criar arquivos. Ele cria um diretório exclusivo, prepara uma entrada com 1003 linhas numeradas e um arquivo binário de 8 bytes, além da subpasta small. Os parênteses executam um subshell, que retorna à pasta anterior ao terminar; set -eu interrompe este bloco simples diante de falhas não tratadas ou variáveis não definidas.

(
set -eu
labdir=$(mktemp -d ./split-demo.XXXXXX)
cd "$labdir"
seq 1 1003 > data.txt
printf 'A\000B\nC\377D\n' > archive.bin
mkdir small
split -l 500 data.txt part-
printf 'Arquivos do laboratório: %s\n' "$PWD"
)

A divisão cria part-aa com 500 linhas, part-ab com 500 e part-ac com as 3 restantes. O primeiro arquivo contém os números de 1 a 500, o segundo de 501 a 1000 e o último de 1001 a 1003. Confira com wc -l part-aa part-ab part-ac e, para inspecionar o conteúdo, com cat.

Split normalmente não imprime os nomes dos arquivos criados, por isso uma execução sem texto na tela pode ter concluído a divisão. A última linha do bloco informa o caminho completo da pasta de prática. Entre nele com cd e aspas antes de executar os próximos comandos; data.txt e archive.bin continuam como entradas originais.

Dividir por tamanho em bytes

O comando abaixo usa o arquivo archive.bin preparado no bloco anterior e escolhe o prefixo archive-part-. No GNU split, 100M significa 100 MiB, ou 104857600 bytes, por parte; o último arquivo pode ser menor.

split -b 100M archive.bin archive-part-

Como o arquivo da prática tem somente 8 bytes, esse comando cria apenas archive-part-aa. O tamanho solicitado é um limite, não uma exigência de preencher a parte com bytes adicionais. Com uma entrada maior que 100 MiB, seriam criadas mais partes, respeitando o limite de cada uma.

Para observar várias partes com esse arquivo pequeno, use um prefixo diferente e ainda não usado: split -b 5 archive.bin tiny- cria tiny-aa com 5 bytes e tiny-ab com 3. Uma divisão por bytes pode cortar uma linha ou um caractere codificado em vários bytes; as partes não precisam ser textos legíveis isoladamente.

As unidades importam: no GNU split, 1M e 1MiB são 1048576 bytes, enquanto 1MB corresponde a 1000000 bytes. Confira a unidade exigida pelo limite de transferência e reserve espaço para as partes e para uma eventual cópia restaurada.

Reunir as partes e verificar a restauração

Depois de executar a divisão com -b 100M, confira que o padrão archive-part-* seleciona somente as partes desse conjunto. Nesta prática há apenas archive-part-aa. O bloco abaixo reúne o conteúdo, compara os bytes e mostra os hashes SHA-256 dos dois arquivos.

cat archive-part-* > archive-restored.bin
cmp archive.bin archive-restored.bin
sha256sum archive.bin archive-restored.bin

O comando cmp não imprime nada e retorna 0 quando os arquivos são idênticos. Na saída de sha256sum, os dois códigos de 64 caracteres devem coincidir; os nomes dos arquivos são diferentes. Se cmp falhar ou os hashes divergirem, não trate o resultado como uma restauração válida.

Para o conjunto tiny criado com -b 5, a ordem explícita é cat tiny-aa tiny-ab > tiny-restored.bin, seguida de cmp archive.bin tiny-restored.bin. A ordem inversa conserva o tamanho total, mas altera o conteúdo. Comparar apenas o tamanho não detecta esse erro.

Em um conjunto maior, confira os nomes, a ordem e se todas as partes estão presentes. Se usar um padrão no Bash, a expansão e a ordenação acontecem no shell antes de cat. Para nomes gerados em ordem tradicional, estabeleça a localidade C no próprio shell antes de expandir o padrão, por exemplo em um subshell com export LC_ALL=C. Depois, compare o resultado com o original ou com um hash confiável guardado antes da transferência.

O destino da restauração deve ficar fora do padrão que seleciona as partes. Não reúna arquivos antigos, cópias auxiliares ou o próprio arquivo de saída junto dos fragmentos. Ao repetir a prática, crie outro diretório exclusivo; reutilizar o mesmo prefixo pode sobrescrever algumas partes e deixar outras de uma execução anterior.

Observar duas partes pequenas sem misturar conjuntos

A subpasta small foi criada vazia no primeiro bloco e separa este exercício dos arquivos de 500 linhas. Execute o bloco abaixo uma vez a partir da pasta principal da prática. set -euo pipefail trata também falhas anteriores no pipeline; o subshell retorna à pasta principal quando termina.

(
set -euo pipefail
cd small
printf 'a\nb\nc\nd\n' | split -l 2 - part-
cat part-aa
cat part-ab
)

A entrada padrão marcada por - é dividida em duas linhas por arquivo. Dentro de small, part-aa contém a e b; part-ab contém c e d. Os dois comandos cat mostram, nesta ordem:

a
b
c
d

Para conferir a leitura dos arquivos, cat small/part-aa small/part-ab produz o mesmo texto a partir da pasta principal. A subpasta evita a colisão com part-aa, part-ab e part-ac do primeiro exercício. Nenhum desses comandos remove a entrada original.

Escolher nomes e entender os limites de linhas

Use -d para sufixos numéricos e -a para uma largura fixa. Por exemplo, crie uma pasta ainda não usada com mkdir numbered e execute split -l 500 -d -a 3 --additional-suffix=.txt data.txt numbered/part-. Os nomes serão part-000.txt, part-001.txt e part-002.txt, com 500, 500 e 3 linhas.

--additional-suffix acrescenta texto ao nome; não converte o conteúdo para outro formato. Escolha uma largura de sufixo suficiente para a quantidade prevista de partes. Se os nomes de uma largura fixa se esgotarem, split falha e os arquivos já criados podem permanecer; confira o status e o conjunto antes de transferi-lo.

-l limita a quantidade de linhas, mas uma linha muito longa ainda pode produzir um arquivo grande. O GNU -C tamanho tenta acomodar linhas completas sem ultrapassar esse tamanho em bytes; porém uma linha individual maior que o limite será dividida. Portanto, -C não garante que toda linha permaneça inteira em qualquer entrada.

Evitar sobrescritas e conferir falhas

Use nomes e pastas de saída novos antes de cada execução. A proteção do shell contra sobrescrita por redirecionamento não impede necessariamente que split abra e substitua seus próprios arquivos de saída. Planeje os nomes e confira o diretório antes de iniciar, principalmente ao trabalhar com dados reais.

Examine as mensagens de erro e consulte echo "$?" imediatamente após uma execução isolada. Uma falha no meio da divisão pode deixar um conjunto incompleto. Preserve a entrada e confirme todas as partes e o hash da restauração antes de remover qualquer cópia que você ainda precise.

Opções principais

Opção Uso
-l N Coloca até N linhas em cada parte no modo comum.
-b tamanho Limita cada parte ao tamanho em bytes; pode cortar linhas e caracteres.
-d Usa sufixos numéricos a partir de zero.
-a N Define a largura do sufixo gerado.
--additional-suffix=texto Acrescenta texto ao final do nome de cada parte.

Pergunta frequente

Split apaga o arquivo original?

A divisão comum lê a entrada e cria arquivos de saída; não apaga o arquivo original. Os arquivos de saída podem ser sobrescritos se os nomes colidirem. Use uma pasta exclusiva, confira o conjunto e compare o conteúdo restaurado antes de decidir quais cópias podem ser removidas.

Documentação

Consulte a documentação oficial do GNU split para unidades, nomes, limites de linhas e formas de divisão. A página de manual de split publicada pelo Debian também reúne as opções; compare-a com a versão instalada.