Como preencher um arquivo com “FF” usando dd?

20

Como preencher um arquivo com 0xFF usando dd ?

Este comando irá preencher o arquivo de saída com zeros até que o tamanho do arquivo atinja 100 KB:

dd if=inputFile.bin ibs=1k count=100 of=paddedFile.bin conv=sync

No entanto, quero preencher um arquivo com 0xFF s em vez de 0x00 s.

    
por XP1 25.04.2011 / 03:19

2 respostas

27

Tanto quanto sei, não há como informar dd ao preenchimento usando 0xFF . Mas há uma solução alternativa.

Primeiro, crie um arquivo com o comprimento necessário preenchido com 0xFF :

$ dd if=/dev/zero ibs=1k count=100 | tr "
$ hexdump -C paddedFile.bin 
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00019000
0" "7" >paddedFile.bin 100+0 records in 200+0 records out 102400 bytes (102 kB) copied, 0,0114595 s, 8,9 MB/s

tr é usado para substituir zeros por 0xFF . tr espera argumentos em octal. 0xFF em octal é 7 .

Resultado:

$ dd if=inputFile.bin of=paddedFile.bin conv=notrunc
0+1 records in
0+1 records out
8 bytes (8 B) copied, 7,4311e-05 s, 108 kB/s

Em seguida, insira o arquivo de entrada no início do arquivo "preenchido":

$ hexdump -C inputFile.bin 
00000000  66 6f 6f 0a 62 61 72 0a                           |foo.bar.|
00000008

Observe o conv=notrunc , que diz dd para não truncar o arquivo de saída.

Exemplo de arquivo de entrada:

$ hexdump -C paddedFile.bin 
00000000  66 6f 6f 0a 62 61 72 0a  ff ff ff ff ff ff ff ff  |foo.bar.........|
00000010  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00019000

Resultado:

$ dd if=/dev/zero ibs=1k count=100 | tr "
$ hexdump -C paddedFile.bin 
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00019000
0" "7" >paddedFile.bin 100+0 records in 200+0 records out 102400 bytes (102 kB) copied, 0,0114595 s, 8,9 MB/s
    
por 25.04.2011 / 11:31
1

Uma possível melhoria na resposta da lesmana é operar no arquivo in-loco. Isso pode ser muito mais rápido para arquivos de entrada grandes e também manterá esparsos os arquivos esparsos. No entanto, em muitas situações, você não deseja modificar seu arquivo de entrada e, portanto, esse método não será adequado.

O exemplo a seguir inicia com um arquivo de entrada grande e esparso e o insere até um tamanho de 1 GB com caracteres FF. Simplesmente altere newsize para o valor desejado. Como você pode ver, a parte dd leva apenas uma fração de segundo, apesar de esse arquivo ser muito grande.

$ ls -ld inputFile.bin
-rw-rw-r-- 1   …   1073741700   …   inputFile.bin
$ hexdump inputFile.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
3fffff80 0000 0000
3fffff84

$ newsize=$((1024 * 1024 * 1024))
$ filesize=$(stat -c "%s" inputFile.bin)
$ padcount=$((newsize - filesize))
$ dd if=/dev/zero ibs=1 count="$padcount" | tr "
$ ls -ld inputFile.bin
-rw-rw-r-- 1   …   1073741700   …   inputFile.bin
$ hexdump inputFile.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
3fffff80 0000 0000
3fffff84

$ newsize=$((1024 * 1024 * 1024))
$ filesize=$(stat -c "%s" inputFile.bin)
$ padcount=$((newsize - filesize))
$ dd if=/dev/zero ibs=1 count="$padcount" | tr "%pre%0" "7" >> inputFile.bin
124+0 records in
0+1 records out
124 bytes (124 B) copied, 0.000162309 s, 764 kB/s

$ ls -ld inputFile.bin
-rw-rw-r-- 1   …   1073741824   …   inputFile.bin
$ hexdump inputFile.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
3fffff80 0000 0000 ffff ffff ffff ffff ffff ffff
3fffff90 ffff ffff ffff ffff ffff ffff ffff ffff
*
40000000
0" "7" >> inputFile.bin 124+0 records in 0+1 records out 124 bytes (124 B) copied, 0.000162309 s, 764 kB/s $ ls -ld inputFile.bin -rw-rw-r-- 1 … 1073741824 … inputFile.bin $ hexdump inputFile.bin 0000000 0000 0000 0000 0000 0000 0000 0000 0000 * 3fffff80 0000 0000 ffff ffff ffff ffff ffff ffff 3fffff90 ffff ffff ffff ffff ffff ffff ffff ffff * 40000000
    
por 17.12.2013 / 01:30