Man 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字节块)被更改时,是否总是需要它?
发布于 2021-10-29 12:32:33
你要做的是:
block_size=1;
dd ... count=1 seek=2 skip=2 bs=$block_size; 您要求dd只复制一个字节。但是,默认情况下,它会截断输出文件,以便文件的末尾是dd完成的地方。
$ echo abcdefgh > test1
$ echo 12345678 > test2
$ dd count=1 bs=1 skip=2 seek=2 if=test1 of=test2
1+0 records in
1+0 records out
1 byte copied, 0.000179375 s, 5.6 kB/s
$ cat test2; echo
12c我所拥有的GNU手册似乎并没有明确地这样说,但是POSIX描述:
of=file指定输出路径名;如果指定了seek=expr,但没有指定conv=notrunc,则副本的效果应该是保留dd查找的输出文件中的块,但输出文件的其他部分不应保留。(If查找文件的大小加上输入文件的大小小于以前输出文件的大小,输出文件将被副本缩短。)
为了防止这种情况,添加conv=notrunc选项:
notrunc不截断输出文件
$ echo 12345678 > test2
$ dd conv=notrunc count=1 bs=1 skip=2 seek=2 if=test1 of=test2
1+0 records in
1+0 records out
1 byte copied, 0.00019385 s, 5.2 kB/s
$ cat test2
12c45678notrunc并没有让它修改实际被复制的数据,所以在这个意义上它不是一个“转换”,即使它被当作到conv的标志。
请注意,如果给出了count=,dd就会执行许多read()调用,这意味着如果您从一个可以进行短读的设备读取,那么实际读取的数据量并不是count倍bs。
发布于 2021-10-29 12:28:26
应该查看完整的文档,man dd:
Full documentation at:
or available locally via: info '(coreutils) dd invocation'“of=FILE”写入文件,而不是标准输出。除非给出‘conv=notrunc’,否则‘dd’会将文件截断为零字节(或用‘seek=’指定的大小)。
https://unix.stackexchange.com/questions/675283
复制相似问题