我正在dd通过实验性地使用它的参数来学习使用。我想创建一个 10 字节的文件。我认为以下方法可行:
dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1
Run Code Online (Sandbox Code Playgroud)
...因为这些来自手册页的评论:
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
...但事实并非如此;它创建了一个 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)
但是为了我的学习,我想了解为什么第一个版本不起作用。谢谢你。
你的命令dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1创建一个两字节的文件,而不是因为之间没有准确定义的相互作用的10个字节的文件bs和obs。(如果你喜欢称这是一个程序错误,但它可能会更好定义为一个文档错误。)你都应该使用两种 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
Run Code Online (Sandbox Code Playgroud)
该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)
| 归档时间: |
|
| 查看次数: |
1355 次 |
| 最近记录: |