我想使用 dd 实用程序用输入文件重写输出文件中的特定区域,我需要跳过输出文件中的前 732618 个字节并从那里开始写入 708800 个字节,我只找到了如何跳过输入文件中的字节,但无法在输出文件中找到如何跳过它的信息,是否可以使用 dd 来完成?
答案1
手册页说:
seek=N
N
obs
在输出开始时跳过大小的块
您可能conv=notrunc
也希望不要截断输出。
$ echo abcdefghijkl > foo.txt
$ echo -n XYZ | dd bs=1 seek=3 of=foo.txt conv=notrunc
3+0 records in [...]
$ cat foo.txt
abcXYZghijkl
请注意,如果您bs=1
按上述方式使用,它将针对write()
每个字节的读写发出一次系统调用,因此速度会很慢。不过,我不会尝试设置obs
为完整的 732618,因为它(据我所知)dd
不会重试部分写入。
使用 GNU dd,您可以添加oflag=seek_bytes
然后将查找偏移量指定为字节,从而允许更合理的块大小。
或者,使用 Perl 进行查找:
$ echo abcdefghijkl > foo.txt
$ echo -n XYZ | ( perl -e 'sysseek STDOUT, 3, 0;'; cat ) 1<> foo.txt
$ cat foo.txt
abcXYZghijkl