dd - como extrair uma subseção de um arquivo com 2 deslocamentos?

1

Eu tenho um arquivo que eu quero onde o deslocamento de byte inicial é 3020852 e o deslocamento de byte final é 13973824.

Existe alguma variação deste comando: dd ibs=X obs=Y skip=1 count=1 que ainda não tenho trabalhado.

    
por CMCDragonkai 13.02.2016 / 08:00

3 respostas

1

Com a ajuda do @agtoever e do @ tom-yan, este é o caminho mais rápido para conseguir isso:

dd if=somefile of=somefile2 skip=$start_offset count=$(($end_offset-$start_offset)) iflag=skip_bytes,count_bytes

Eu deixei o bs não especificado, mas ele pode ser definido para qualquer coisa. Um 1MiB bs é uma boa regra de ouro.

Obrigado.

    
por 13.02.2016 / 13:01
4

Existem várias maneiras de fazer isso, como você pode ler em esta questão semelhante . Eu darei a você a abordagem (na minha opinião mais "idiomática") head | tail e a abordagem dd .

head --bytes=<end_offset> in_file.bin | tail --bytes=<end_offset - start_offset> > out_file.bin

Alternativamente:

dd bs=1 skip=<start_offset> count=<end_offset - start_offset> < in_file > out_file.bin

    
por 13.02.2016 / 09:36
1

Quando as ferramentas existentes falham, escreva o seu próprio:

#!/usr/bin/env python
start, end = 3020852, 13973824
with open("input.bin", "rb") as inf:
    with open("output.bin", "wb") as outf:
        inf.seek(start)
        data = inf.read(end-start)
        outf.write(data)
        # just in case
        assert(inf.tell() == end)

O tamanho total não é grande, basta ler todo o bloco na RAM de uma só vez. Se você quisesse copiar vários GB por bloco, poderia fazê-lo desta maneira:

#!/usr/bin/env python
start = 3020852
end = 13973824
size = end - start
bs = 32 << 20   # (32 MB)
with open("input.bin", "rb") as inf:
    with open("output.bin", "wb") as outf:
        inf.seek(start)
        while size > 0:
            data = inf.read(min(size, bs))
            outf.write(data)
            size -= len(data)
        assert(inf.tell() == end)
    
por 13.02.2016 / 11:19

Tags