Может ли dd перезаписывать части файла?

У меня есть большой файл размером 1 ТБ (образ диска с поврежденного диска) и небольшой файл размером 1,3 МБ (начало диска-файла).

Используя содержимое небольшого файла, я хочу переписать части большого файла. То есть, я хочу вставить / перезаписать первый 1.3MB 1TB-изображения, используя небольшой файл.

Используя небольшие временные файлы для тестирования, я не смог перезаписать части файлов. Скорее, dd полностью перезаписал файлы. Это не то, что я хочу.

Возможно ли это сделать?

Если вы используете аргумент conv=notrunc , вы можете заменить только первое количество байтов.
например, dd conv=notrunc if=small.img of=large.img

 root@debian:~/ddtest# dd if=/dev/zero of=file1.img bs=1M count=10 10+0 records in 10+0 records out 10485760 bytes (10 MB) copied, 1.14556 s, 9.2 MB/s root@debian:~/ddtest# dd if=/dev/urandom of=file2.img bs=1M count=1 1+0 records in 1+0 records out 1048576 bytes (1.0 MB) copied, 0.207185 s, 5.1 MB/s root@debian:~/ddtest# head file1.img << Blank space here as it's all Zeroes >> root@debian:~/ddtest# dd conv=notrunc if=file2.img of=file1.img 2048+0 records in 2048+0 records out 1048576 bytes (1.0 MB) copied, 0.00468016 s, 224 MB/s root@debian:~/ddtest# head file1.img ^ v y ے!  E 91     << SNIP Random garbage >> root@debian:~/ddtest# 

Если вы хотите перезаписать только в начале файла и оставить остальное неповрежденным, используйте параметр conv=notrunc чтобы предотвратить усечение:

 dd conv=notrunc if=/dev/zero of=test bs=1024 count=1024 

notrunc означает :

Не усекайте выходной файл. Сохранять блоки в выходном файле, явно не записанные этим вызовом утилиты dd .

Он находится в POSIX и поддерживается каждой версией dd .

Если вы хотите перезаписать начало big-file содержимым small-file не затрагивая остальных, вы можете просто использовать любую оболочку, похожую на Bourne:

 cat small-file 1<> big-file 

Оператор перенаправления <> открывает файл в режиме чтения и записи без усечения. Это было бы эквивалентно использованию dd 's conv=notrunc но без всех проблем и ограничений dd .

Если вы хотите написать контент в любом месте, кроме самого начала, вам нужно искать нужную позицию в файле. Вот где dd и его seek=xxx пригодится, хотя вы также можете использовать оболочку, которая имеет встроенные ksh93 операторы, такие как ksh93 или zsh :

 cat small-file 1<> big-file >#((12345)) # ksh93 zmodload zsh/system; {sysseek -u1 12345 && cat small-file} 1<> big-file # zsh 

Пример:

 printf '\xa1' | dd conv=notrunc of=Yourfile bs=1 seek=$((0xoffset))