você está aqui: Home → Colunistas → Cantinho do Shell
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 07 de Março de 2008
Muitas vezes precisamos dividir um arquivo em vários outros menores, seguindo alguma convenção. Para isto podemos usar tanto o comando split
.
O comando split
nos permite dividir um arquivo baseando-se no número de linhas ou número de bytes que cada arquivo novo deve conter.
Por exemplo:
% split -l 10 /etc/passwd
Este comando criará vários arquivos denominados xaa, xab, xac, etc. Nem sempre estes nomes são os mais convenientes. Neste caso podemos, com o acréscimo de mais um parâmetro, determinar o sufixo do nome dos arquivos que serão criados:
% split -l 10 /etc/passwd pas- % ls pas-aa pas-ab pas-ac pas-ad pas-ae pas-af pas-ag pas-ah
Os arquivos criados passaram a conter o prefixo "pas-", permitindo identificar mais claramente os contadores dos arquivos (aa, ab, ac, etc.)
Além do particionamento em linhas, o comando split
, quando invocado com a opção "b", irá efetuar a divisão do arquivo baseando-se no número de bytes:
% split -b 32k /etc/passwd pas-
ou então
% split -b 32 /etc/passwd pas-
ou ainda
% split -b 32m /etc/passwd pas-
No primeiro exemplo, o arquivo /etc/passwd será dividido em vários arquivos de 32kbytes cada um, ao passo que no segundo exemplo, o arquivo será dividido em arquivos de 32 bytes cada. No terceiro exemplo, o arquivo /etc/passwd é dividido em arquivos de 32MB cada (pouco provável :-)
Outro comando também utilizado para se dividir um arquivo em vários outros é o comando csplit
(Content Split).
Ao contrário do comando split, o comando csplit
permite que se especifique uma string que irá indicar o delimitador de cada um dos novos arquivos.
Tomemos como exemplo o arquivo abaixo, chamado arq1:
Capítulo 1 Era uma vez, era uma vez três porquinhos, Palhaço, Palito e Pedrito. Capítulo 2 E o Lobo Mau, ... Capítulo 3 E o caçador, matou o Lobo Mau, casou-se com a Chapeuzinho Vermelho, e viveram felizes para sempre. The End
O autor, colocou todos os capítulos do livro em apenas um arquivo e depois se arrependeu. Agora ele quer criar vários arquivos contendo um capítulo cada. O comando abaixo pode resolver este problema:
% csplit -f Capit arq1 "/Capítulo/" {2} % ls -l total 4 -rw-r--r-- 1 queiroz supsof 0 Jun 17 18:31 Capit00 -rw-r--r-- 1 queiroz supsof 85 Jun 17 18:31 Capit01 -rw-r--r-- 1 queiroz supsof 29 Jun 17 18:31 Capit02 -rw-r--r-- 1 queiroz supsof 136 Jun 17 18:31 Capit03 -rw-r--r-- 1 queiroz supsof 250 Jun 17 18:11 arq1
Traduzindo, o comando csplit
irá criar vários arquivos iniciados em "Capit", até um máximo de 3 arquivos (parâmetro {2}, computa-se o número entre colchetes + 1). Este valor indica o número de vezes que o comando será repetido. No nosso exemplo, foi especificado exatamente o número de capítulos contidos no arquivo original (3). Caso não conheçamos este valor, podemos especificar um número que sabemos maior que o número de arquivos existentes. O comando csplit
irá reclamar, e apagar todos os arquivos já criados. Para evitarmos que isto aconteça, basta especificar a flag "-k", ou seja, a reclamação continuará sendo feita, mas o trabalho já feito não será removido. O que não pode é se especificar um número inferior ao desejado. Neste caso, o comando ficaria como:
% csplit -k -f Capit arq1 "/Capítulo/" {9} 0 85 29 csplit: {9} - out of range 136
A quebra será feita, tomando-se por base o nosso exemplo, antes da string Capítulo, exclusive. Devido a isto, o primeiro arquivo, Capit00, está vazio. Os arquivos criados, à exceção do arquivo Capit00 que está vazio, contêm:
Capítulo 1 Era uma vez, era uma vez três porquinhos, Palhaço, Palito e Pedrito. ...
Capítulo 2 E o Lobo Mau, ...
Capítulo 3 E o caçador, matou o Lobo Mau, casou-se com a Chapeuzinho Vermelho, e viveram felizes para sempre. The End
Publicado originalmente na Dicas-L em 19 de junho de 1997 e 18 de junho de 1997