我有一个 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
。
如果您想将内容写入文件开头以外的任何位置,则需要在文件中的所需位置进行查找。这就是dd
它seek=xxx
派上用场的地方,尽管您也可以使用具有内置搜索运算符的 shell,例如ksh93
or 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))