dd
を使用して0xFF
でファイルを埋め込む方法
このコマンドは、ファイルサイズが100 KBに達するまで、出力ファイルにゼロを埋め込みます。
dd if=inputFile.bin ibs=1k count=100 of=paddedFile.bin conv=sync
ただし、0xFF
sではなく0x00
sを使用してファイルを埋め込みたいです。
私が知る限り、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
は引数が8進数であることを期待します。 8進数の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
出力ファイルを切り捨てないようにdd
に指示するconv=notrunc
に注意してください。
入力ファイルの例:
$ 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
Lesmanaの答えに対する可能な改善は、ファイルをインプレースで操作することです。これは、大きな入力ファイルの場合ははるかに高速になる可能性があり、スパースファイルをスパースに保ちます。ただし、多くの場合、入力ファイルを変更したくないため、この方法は適していません。
次の例は、大規模でスパースな入力ファイルから始まり、FF文字で1GBのサイズまで埋めます。 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