20

Как дополнить файл 0xFF с помощью dd?

Эта команда заполнит выходной файл нулями, пока размер файла не достигнет 100 КБ:

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

Тем не менее, я хочу дополнить файл 0xFF с вместо 0x00 с.

2 ответа2

27

Насколько я знаю, нет способа сообщить dd pad, используя 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
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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .