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
或者 ibs
和obs
。
根据经验,似乎会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