我有一个 1TB 大文件(来自损坏驱动器的磁盘映像)和一个 1.3MB 小文件(磁盘文件的开头)。
使用小文件的内容,我想覆盖大文件的部分内容。也就是说,我想使用小文件插入/覆盖 1TB 图像的前 1.3MB。
使用小的临时文件进行测试我无法覆盖部分文件。相反, dd 完全覆盖了文件。这不是我想要的。
dd 能做到这一点吗?
Law*_*nce 42
如果使用该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#
Run Code Online (Sandbox Code Playgroud)
Mic*_*mer 25
如果您只想在文件开头覆盖,而其余部分保持不变,请使用conv=notrunc
防止截断的选项:
dd conv=notrunc if=/dev/zero of=test bs=1024 count=1024
Run Code Online (Sandbox Code Playgroud)
notrunc
意思是:
不要截断输出文件。保留输出文件中未通过调用dd实用程序显式写入的块。
它在 POSIX 中,因此每个版本的dd
.
如果你想覆盖开始的big-file
与内容small-file
不影响休息,你可以做任何类似Bourne外壳:
cat small-file 1<> big-file
Run Code Online (Sandbox Code Playgroud)
该<>
重定向操作员打开在读+写模式文件而不截断。这相当于使用dd
'sconv=notrunc
但没有dd
.
如果您想将内容写入文件开头以外的任何位置,则需要在文件中的所需位置进行查找。这就是dd
它seek=xxx
派上用场的地方,尽管您也可以使用具有内置搜索运算符的外壳,例如ksh93
or zsh
:
cat small-file 1<> big-file >#((12345)) # ksh93
zmodload zsh/system; {sysseek -u1 12345 && cat small-file} 1<> big-file # zsh
Run Code Online (Sandbox Code Playgroud)
小智 5
例子:
printf '\xa1' | dd conv=notrunc of=Yourfile bs=1 seek=$((0xoffset))
Run Code Online (Sandbox Code Playgroud)