我正在尝试使用dd
将数据从文件传输到另一个文件。
由于我在循环中多次调用dd
,我必须从输入文件中跳过一定数量的块然后开始复制。
但是,在最后一次迭代中,输出块大小可能与以前的大小不同,因此我需要将ibs
和obs
个操作数设置为不同的值,并跳过第一个 N <输入文件中的/ em> ibs
-sized 块。
我知道在dd 8.2中这可以通过设置iflag=skip_bytes
操作数并指定要跳过的确切字节数而不是块数来完成,但是我在dd 8.4中没有该标志。使用。
因此,我尝试通过设置iflag=count_bytes
选项和count
等于要复制的字节数来实现此目的。
关于循环的正常迭代和最后一个循环的结果命令如下:
dd if=./ifile of=./ofile iflag=count_bytes ibs=512 obs=512 skip=0 count=512
...
dd if=./ifile of=./ofile iflag=count_bytes ibs=512 obs=256 skip=2 count=256
但dd在复制数据时挂起。如果我强制终止每次迭代,我从dd得到以下输出:
// ibs:512 obs:512 skip:0 count:512
^C1+0 records in
0+0 records out
0 bytes (0 B) copied, 9.25573 s, 0.0 kB/s
...
// ibs:512 obs:256 skip:2 count:256
^C0+1 records in
0+0 records out
0 bytes (0 B) copied, 5.20154 s, 0.0 kB/s
我错过了什么吗?
编辑:从以下C代码调用dd:
while (bytes_sent < tot_bytes){
unsigned int packet_size = (tot_bytes - bytes_sent < MAX_BLOCK_SIZE) ?
(tot_bytes - bytes_sent) : MAX_BLOCK_SIZE;
sprintf(cmd, "dd if=./ifile of=./ofile iflag=count_bytes ibs=%u obs=%u skip=%u count=%u",
MAX_BLOCK_SIZE, packet_size, sent, packet_size);
system(cmd);
bytes_sent += packet_size;
sent++;
}
提前感谢您的帮助!