dd 可以覆盖文件的部分内容吗?

dd 可以覆盖文件的部分内容吗?

我有一个 1TB 大文件(来自损坏的驱动器的磁盘映像)和一个 1.3MB 小文件(磁盘文件的开头)。

使用小文件的内容,我想覆盖大文件的部分内容。也就是说,我想使用小文件插入/覆盖 1TB 映像的前 1.3MB。

使用小型临时文件进行测试我无法覆盖部分文件。相反,dd 完全覆盖了文件。这不是我想要的。

dd可以做到这一点吗?

答案1

如果使用该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# 

答案2

如果您只想覆盖文件的开头,并保持其余部分不变,请使用conv=notrunc防止截断的选项:

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

notrunc 方法:

不要截断输出文件。保留输出文件中未通过此调用显式写入的块DD公用事业。

它采用 POSIX 格式,因此每个版本都支持dd.

答案3

如果你想覆盖开始big-file的内容而不small-file影响其余部分,您可以使用任何类似 Bourne 的 shell 来执行此操作:

cat small-file 1<> big-file

重定向<>运算符以读+写模式打开文件而不截断。这相当于使用dd'sconv=notrunc但没有 的所有问题和限制dd

如果您想将内容写入文件开头以外的任何位置,则需要在文件中的所需位置进行查找。这就是ddseek=xxx派上用场的地方,尽管您也可以使用具有内置搜索运算符的 shell,例如ksh93or zsh

cat small-file 1<> big-file >#((12345)) # ksh93

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

答案4

例子:

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

相关内容