Як прокласти файл "FF" за допомогою dd?


20

Як прокласти файл за 0xFFдопомогою dd?

Ця команда буде вкладати нульовий файл у вихідний файл, поки розмір файлу не досягне 100 Кб:

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

Однак я хочу вкласти файл із 0xFFs замість 0x00s.

Відповіді:


29

Наскільки я знаю, немає ніякого способу сказати, ddщоб використовувати тампон 0xFF. Але є рішення.

Спочатку створіть файл потрібної довжини, заповнений 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

trвикористовується для заміни нулів на 0xFF. trочікує аргументів у восьмериці. 0xFFв восьмикутнику є \377.

Результат:

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

Потім вставте вхідний файл на початку "підкладеного" файлу:

$ 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

Зверніть увагу на те, conv=notruncщо вказує ddне усікати вихідний файл.

Приклад вхідного файлу:

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

Результат:

$ 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

2
Крок 1 працює в Linux, але в OSX файл paddedFile.binзаповнюється c3 bf. Цікаво, чому? редагувати: superuser.com/questions/1349494/…
Synesso

1

Можливе поліпшення відповіді лесмена полягає в роботі над файлом на місці. Це може бути набагато швидше для великих вхідних файлів, а також збереже рідкісні файли. Однак у багатьох ситуаціях ви не хочете змінювати вхідний файл, і цей метод буде непридатним.

Наступний приклад починається з великого, розрідженого вхідного файлу і прошиває його до розміру 1 ГБ із знаками FF. Просто змініть newsizeна бажане значення. Як бачите, ddпорція займає лише частку секунди, незважаючи на те, що цей файл дуже великий.

$ 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.