Como posso encurtar um arquivo na linha de comando?

Como posso encurtar um arquivo na linha de comando?

Eu tenho um arquivo xml de 150 GB que gostaria de encurtar (ou seja, truncar) para cerca de 1 GB - existe um comando simples (bash ou similar) que eu possa usar ou preciso seguir a rota programática (editando-o no vi ou 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 software e não esperar muitas horas pela resposta, um arquivo mais curto me permitirá fazer isso.)

Responder1

Supondo que você queira truncar e extrair o primeiro 1 GB do arquivo de 150 GB:

Com head:

head -c 1G infile > outfile

Observe que o Gsufixo pode ser substituído por GBpara alinhar com 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, ddpode truncar no lugar.

Responder2

Para truncar um arquivo para 1 gigabyte, use o truncatecomando:

truncate -s 1G file.xml

O resultado do truncamento provavelmente não será um arquivo XML válido, mas presumo que você entende isso.

A documentação para a versão GNU truncateéaquie a documentação para a versão BSD éaqui

Responder3

Sempre que possível, eu usaria o truncatecomando como na resposta de John1024. Porém, não é um comando unix padrão, então algum dia você poderá não conseguir usá-lo. Nesse caso, ddtambém é possível fazer um truncamento no local.

ddO comportamento padrão do é truncar o arquivo de saída no ponto onde a cópia termina, então você apenas fornece a ele um arquivo de entrada de comprimento 0 e diz para ele começar a escrever no ponto de truncamento desejado:

dd if=/dev/null of=filename bs=1048576 seek=1024

(Isso não é o mesmo que copiar e truncar ddna resposta do multithr3at3d.)

Observe que usei 1048576 e 1024 porque 1048576*1024 é o tamanho desejado. Evitei bs=1m porque esta é uma resposta de "portabilidade" e o clássico ddsó conhece os sufixos k, be w.

Responder4

Você pode usar o splitcomando.

split -C 1G <filename>

Para mais detalhes dê uma olhada nissoresposta stackoverflow

informação relacionada