dd 是否能够覆盖文件的一部分?

bos*_*bos 37 dd

我有一个 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)

  • 这不是原始问题的一部分,但您可以使用 `seek` 选项写入输出文件开头以外的其他位置,并使用 `skip` 选项开始读取输入文件开头以外的其他位置. 与其他选项一起,您可以将一个文件的任意部分复制到另一个文件的任意位置。 (16认同)

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.


Sté*_*las 6

如果你想覆盖开始big-file与内容small-file不影响休息,你可以做任何类似Bourne外壳:

cat small-file 1<> big-file
Run Code Online (Sandbox Code Playgroud)

<>重定向操作员打开在读+写模式文件而不截断。这相当于使用dd'sconv=notrunc但没有dd.

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

  • ```但是没有dd的所有问题和限制```有什么问题和限制? (2认同)

小智 5

例子:

printf '\xa1' | dd conv=notrunc of=Yourfile bs=1 seek=$((0xoffset))
Run Code Online (Sandbox Code Playgroud)