dd 与 obs 和 seek 生成意外大小的文件

Sto*_*row 7 linux dd

我正在dd通过实验性地使用它的参数来学习使用。我想创建一个 10 字节的文件。我认为以下方法可行:

dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1
Run Code Online (Sandbox Code Playgroud)

...因为这些来自手册页的评论:

   obs=BYTES
          write BYTES bytes at a time (default: 512)
   seek=N skip N obs-sized blocks at start of output
Run Code Online (Sandbox Code Playgroud)

...但事实并非如此;它创建了一个 2 字节的文件:

>ls -l foo
-rw-rw-r-- 1 user user 2 Mar 28 16:05 foo
Run Code Online (Sandbox Code Playgroud)

我的解决方法是:

dd if=/dev/zero of=./foo count=1 bs=1 obs=1 seek=9
Run Code Online (Sandbox Code Playgroud)

但是为了我的学习,我想了解为什么第一个版本不起作用。谢谢你。

roa*_*ima 9

你的命令dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1创建一个两字节的文件,而不是因为之间没有准确定义的相互作用的10个字节的文件bsobs。(如果你喜欢称这是一个程序错误,但它可能会更好定义为一个文档错误。)你都应该使用两种 bs ibsobs

根据经验,似乎bs覆盖了obs,因此执行的是dd if=/dev/zero of=./foo count=1 bs=1 seek=1,它创建了一个两字节的文件,如您所见。

如果您使用过,dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1您会得到一个 10 字节的文件。

作为替代方案,如果您想创建一个不占用磁盘上任何数据空间的空文件,您可以使用反直觉命名的truncate命令:

truncate --size=10 foo
Run Code Online (Sandbox Code Playgroud)


xhi*_*nne 7

POSIX手册页指出:

ibs=expr

通过 expr(默认为 512)指定输入块大小(以字节为单位)。

obs=expr

通过 expr(默认为 512)指定输出块大小(以字节为单位)。

bs=expr

输入和输出块大小设置为 expr 字节,取代 ibs= 和 obs=。如果没有指定除sync、noerror 和notrunc 以外的任何转换,则每个输入块都应作为单个块复制到输出,而不聚合短块。

Linux 的dd工作方式相同。因此,请ibs改用:

dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,POSIX 手册页定义了 `bs` 和 `ibs`/`obs` 之间的交互,但(至少)Debian 和 Cygwin 上的 Linux 没有定义。+1 找到那个。 (2认同)