Eu tenho um arquivo xml de 150GB que gostaria de encurtar (ou seja, truncar) para cerca de 1GB - existe um comando simples (bash ou similar) que posso usar ou tenho que seguir a rota programática (editando-o no vi ou no emacs é um pesadelo mesmo em grandes sistemas de ferro)?
(Não estou particularmente preocupado com a perda de informações, quero um arquivo mais curto para poder testar um pedaço de software e não esperar muitas horas pela resposta; um arquivo mais curto me permitirá fazer isso.)
bash
unix
file-management
adrianmcmenamin
fonte
fonte
Respostas:
Supondo que você deseja truncar e extrair os primeiros 1 GB do arquivo de 150 GB:
Com
head
:head -c 1G infile > outfile
Observe que o
G
sufixo pode ser substituído porGB
para alinhar a 1000 em vez de 1024.Ou com
dd
:dd if=infile of=outfile bs=1M count=1024
Ou, como na resposta de Wumpus Q. Wumbley,
dd
pode truncar no lugar.fonte
Para truncar um arquivo para 1 gigabyte, use o
truncate
comando:O resultado do truncamento provavelmente não será um arquivo XML válido, mas entendo que você entende isso.
A documentação para a versão GNU de
truncate
está aqui e a documentação para a versão BSD está aquifonte
Sempre que possível, eu usaria o
truncate
comando como na resposta de John1024. No entanto, não é um comando unix padrão; portanto, um dia você poderá ser incapaz de usá-lo. Nesse caso,dd
também é possível fazer um truncamento no local.dd
O comportamento padrão do usuário é truncar o arquivo de saída no ponto em que a cópia termina, portanto, basta fornecer um arquivo de entrada de tamanho 0 e solicitar que comece a escrever no ponto de truncamento desejado:(Isso não é o mesmo que copiar e truncar
dd
na resposta do multithr3at3d.)Observe que eu usei 1048576 e 1024 porque 1048576 * 1024 é o tamanho desejado. Evitei bs = 1m porque esta é uma resposta "portabilidade", e clássico
dd
só conhece sufixosk
,b
ew
.fonte
bs
número multiplicado peloseek
número é o número de bytes a serem mantidos. Quaisquer dois números que satisfaçam essa restrição devem funcionar; por exemplo,bs=1073741824 seek=1
oubs=1 seek=1073741824
. Ou, como obs
padrão é 512, porseek=2097152
si só também deve funcionar. E você pode usar a notação como1M
,1K
,1G
e2M
.Não tenho muita certeza do que você está perguntando. Você só quer se livrar dos outros 149 GB ou está tentando compactar 150 GB em 1 GB? Independentemente disso, esse pode ser um método útil para fazer isso.
O
split
comando pode dividir qualquer arquivo em várias partes. Veja o homem se separar . Você pode especificar o tamanho dos blocos de arquivos nos quais deseja dividi-los com a-b
opção Por exemplo:$ split -b 1GB myfile.xml
Sem outras opções, isso deve criar vários arquivos no diretório atual, começando com a letra
x
. Se você deseja ajustar os nomes dos arquivos divididos, consulte a página do manual.Para remontar o arquivo, basta usar
cat * > re-assembled.xml
.Exemplo:
fonte
Você pode usar o
split
comandoPara mais detalhes, dê uma olhada nesta resposta do stackoverflow
fonte
No final, apenas usei
sed
para extrair um número arbitrário de linhas:fonte
sed 1000000q
(e um pouco mais compacto, visualmente falando).