dd 与 obs 和eek 使文件大小意外

dd 与 obs 和eek 使文件大小意外

dd我正在通过实验性地研究它的论点来学习使用。我想创建一个 10 字节的文件。我认为以下方法会起作用:

dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1

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

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

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

>ls -l foo
-rw-rw-r-- 1 user user 2 Mar 28 16:05 foo

我的解决方法是:

dd if=/dev/zero of=./foo count=1 bs=1 obs=1 seek=9

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

答案1

您的命令dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1创建一个 2 字节文件而不是 10 字节文件,因为bs和之间的交互定义不明确obs之间的交互定义不明确,创建了一个 2 字节文件而不是 10 字节文件。 (如果您愿意,可以将其称为程序错误,但最好将其定义为文档错误。)您应该使用任何一个 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

答案2

POSIX 联机帮助页状态:

ibs=表达式

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

obs=表达式

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

bs=表达式

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

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

dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1

相关内容