Jak wypełnić plik „FF” za pomocą dd?

20

Jak wypełnić plik za 0xFFpomocą dd?

To polecenie spowoduje uzupełnienie pliku wyjściowego zerami, aż rozmiar pliku osiągnie 100 KB:

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

Chcę jednak uzupełnić plik za pomocą 0xFFs zamiast 0x00s.

XP1
źródło

Odpowiedzi:

29

O ile wiem, nie ma sposobu, aby powiedzieć, ddaby użyć pad 0xFF. Ale istnieje obejście.

Najpierw utwórz plik o wymaganej długości wypełniony 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

trsłuży do zamiany zer na 0xFF. troczekuje argumentów ósemkowych. 0xFFw ósemce jest \377.

Wynik:

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

Następnie wstaw plik wejściowy na początku pliku „wypełnianego”:

$ 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

Zwróć uwagę, conv=notruncktóra mówi, ddaby nie obcinać pliku wyjściowego.

Przykładowy plik wejściowy:

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

Wynik:

$ 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
źródło
2
Krok 1 działa w systemie Linux, ale w systemie OSX plik paddedFile.binjest wypełniony c3 bf. Zastanawiam się dlaczego? edycja: superuser.com/questions/1349494/…
Synesso,
1

Możliwym ulepszeniem odpowiedzi lesmany jest działanie na pliku w miejscu. Może to być znacznie szybsze w przypadku dużych plików wejściowych, a także rzadkie pliki rzadkie. Jednak w wielu sytuacjach nie chcesz modyfikować pliku wejściowego, więc ta metoda będzie nieodpowiednia.

Poniższy przykład zaczyna się od dużego, rzadkiego pliku wejściowego i uzupełnia go do rozmiaru 1 GB znakami FF. Po prostu zmień newsizena żądaną wartość. Jak widać, ddczęść zajmuje tylko ułamek sekundy, mimo że ten plik jest bardzo duży.

$ 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
źródło