¿Cómo rellenar un archivo con "FF" usando dd?

20

¿Cómo rellenar un archivo con el 0xFFuso dd?

Este comando rellenará el archivo de salida con ceros hasta que el tamaño del archivo alcance los 100 KB:

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

Sin embargo, quiero rellenar un archivo con 0xFFs en lugar de 0x00s.

XP1
fuente

Respuestas:

29

Hasta donde yo sé, no hay forma de decirle ddque use el pad 0xFF. Pero hay una solución alternativa.

Primero cree un archivo con la longitud requerida con 0xFF:

$ dd if=/dev/zero ibs=1k count=100 | tr "\000" "\377" >paddedFile.bin
100+0 records in
200+0 records out
102400 bytes (102 kB) copied, 0,0114595 s, 8,9 MB/s

trse usa para reemplazar ceros con 0xFF. trespera argumentos en octal. 0xFFen octal es \377.

Resultado:

$ hexdump -C paddedFile.bin 
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00019000

Luego inserte el archivo de entrada al comienzo del archivo "relleno":

$ 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

Tenga en conv=notrunccuenta que indica ddque no truncar el archivo de salida.

Archivo de entrada de ejemplo:

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

Resultado:

$ 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
lesmana
fuente
2
El paso 1 funciona en Linux, pero en osx el archivo paddedFile.binestá lleno c3 bf. ¿Me pregunto porque? edit: superuser.com/questions/1349494/...
Synesso
1

Una posible mejora en la respuesta de lesmana es operar en el archivo en el lugar. Esto podría ser mucho más rápido para archivos de entrada grandes y también mantendrá dispersos los archivos dispersos. Sin embargo, en muchas situaciones no desea modificar su archivo de entrada, por lo que este método no será adecuado.

El siguiente ejemplo comienza con un archivo de entrada grande y disperso y lo rellena hasta un tamaño de 1 GB con caracteres FF. Simplemente cambie newsizea su valor deseado. Como puede ver, la ddporción toma solo una fracción de segundo a pesar de que este archivo es muy 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 "\000" "\377" >> 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
asdf
fuente