Como fazer coisas como dd if=somefile bs=1 skip=1337 count=31337000
, mas eficientemente, não usar leituras e gravações de 1 byte?
A solução é esperada:
- Para ser simples (para não-simples, eu posso escrever algum Perl oneliner que fará isso)
- Para suportar grandes desvios e comprimentos (para que hacks com tamanho de bloco no dd não ajudem)
Solução parcial (não é simples o suficiente, tentar o mesmo com comprimento tornará ainda mais complexo):
dd if=somefile bs=1000 skip=1 count=31337 | { dd bs=337 count=1 of=/dev/null; rest_of_pipeline; }
# 1337 div 1000 and 1337 mod 1000
Respostas:
Isso deve ser feito (no gnu dd):
Caso você esteja usando
seek=
também, você também pode consideraroflag=seek_bytes
.De
info dd
:Ps: Entendo que essa pergunta é antiga e parece que essas sinalizações foram implementadas depois que a pergunta foi feita originalmente, mas como é um dos primeiros resultados do google para uma pesquisa de dd relacionada que eu fiz, achei interessante atualizar com o novo característica.
fonte
Use um processo para abandonar todos os bytes iniciais e, em seguida, um segundo para ler os bytes reais, por exemplo:
O segundo
dd
pode ler a entrada com qualquer tamanho de bloco que você achar eficiente. Observe que isso requer que um processo extra seja gerado; dependendo do seu sistema operacional, que terá um custo, mas provavelmente será menor do que ter que ler os arquivos um a um byte (a menos que você tenha um arquivo muito pequeno; nesse caso, não haveria problema).fonte
dd if=/dev/sda bs=10000000001 | dd bs=255 count=1 | hd
-> "dd: número inválido '10000000001'"dd if=/dev/sda bs=16M skip=596 count=1 | dd bs=512 skip=1522 count=1 | (dd bs=1 count=1 of=/dev/null ; dd bs=255 count=1)
read -n
para pular? E depoishead -c
contar? Por exemplocat somefile | (read -n 1337; head -c 31337000)
Ou você poderia fazê-lo sem desova um processo adicional:exec 3<somefile; read -n 1337 -u 3; head -c 31337000 <&3
Em vez de
bs=1
usarbs=4096
ou mais.fonte
f.seek(1337)
antes de usarread(MY_CHUNK_SIZE)
Você pode tentar o comando hexdump:
Se você simplesmente deseja ver o conteúdo:
fonte