男人dd
:
dd - 转换和复制文件
我倾向于使用dd
. 奇怪的是,复制 1 字节文本文件后变得小得多:
$ block_size=1; device_to_edit=/media/ramdrive/a; device_from=/media/ramdrive/b; echo "aaaaaaaaaa">$device_to_edit; echo "bbbbbbbbbb">$device_from; cat $device_to_edit; cat $device_from; dd if=$device_from of=$device_to_edit count=1 seek=2 skip=2 bs=$block_size; cat $device_to_edit
aaaaaaaaaa
bbbbbbbbbb
1+0 records in
1+0 records out
1 byte copied, 0,000156688 s, 6,4 kB/s
aab
它说1 byte copied
,为什么文件结尾不见了?
添加:
正如评论所建议的,conv=notrunc
修复它。但从man
:
conv=CONVS 根据逗号分隔的符号列表转换文件
我不想转换文件。在阅读有关复制块设备的内容时,我还没有看到这个操作数。当不是所有文件(例如 /dev/sdb: USB 磁盘中的一个 512 字节块)都被更改时,是否总是需要它?
你在做什么是这样的:
你要求
dd
只复制一个字节。但是,默认情况下,它会截断输出文件,以便文件末尾dd
完成。我拥有的 GNU 手册页似乎没有明确说明,但POSIX 描述确实如此:
为防止这种情况,请添加以下
conv=notrunc
选项:notrunc
不会使它修改实际复制的数据,因此从这个意义上说,它不是“转换”,即使它被视为conv
.请注意,如果
count=
给出,dd
则执行那么多read()
调用,这意味着如果您从可以进行短读取的设备读取,则实际读取的数据量不是count
timesbs
。应该查看完整的文档,
man dd
: