dd com obs e seek faz arquivo de tamanho inesperado

6

Estou aprendendo a usar dd brincando experimentalmente com seus argumentos. Eu gostaria de criar um arquivo de 10 bytes. Eu pensei que o seguinte funcionaria:

dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1

... por causa desses comentários da página do manual:

   obs=BYTES
          write BYTES bytes at a time (default: 512)
   seek=N skip N obs-sized blocks at start of output

... mas isso não acontece; cria um arquivo de 2 bytes:

>ls -l foo
-rw-rw-r-- 1 user user 2 Mar 28 16:05 foo

Minha solução alternativa foi:

dd if=/dev/zero of=./foo count=1 bs=1 obs=1 seek=9

Mas, para meu aprendizado, gostaria de entender por que a primeira versão não funciona. Obrigado.

    
por StoneThrow 29.03.2017 / 02:33

2 respostas

8

Seu comando dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1 cria um arquivo de dois bytes em vez de um de 10 bytes devido à interação mal definida entre bs e obs . (Chame isso de um bug do programa, se quiser, mas provavelmente é melhor definido como um bug de documentação.) Você deve usar bs ou ibs e obs .

Empiricamente, parece que bs substitui obs , então o que é executado é dd if=/dev/zero of=./foo count=1 bs=1 seek=1 , que cria um arquivo de dois bytes como você viu.

Se você tivesse usado dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1 , teria um arquivo de 10 bytes como esperado.

Como alternativa, se você deseja criar um arquivo vazio que não ocupa nenhum espaço de dados no disco, pode usar o comando% intuitivo truncate :

truncate --size=10 foo
    
por 29.03.2017 / 03:00
6

A página man do POSIX afirma:

ibs=expr

Specify the input block size, in bytes, by expr (default is 512).

obs=expr

Specify the output block size, in bytes, by expr (default is 512).

bs=expr

Set both input and output block sizes to expr bytes, superseding ibs= and obs=. If no conversion other than sync, noerror, and notrunc is specified, each input block shall be copied to the output as a single block without aggregating short blocks.

O dd do Linux funciona da mesma maneira. Portanto, use ibs :

dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1
    
por 29.03.2017 / 02:52

Tags