如何在Linux中创建任意大小的文件?

10

我已经阅读了这个问题:如何在Linux中创建指定大小的文件?

但是我没有得到我问题的答案。

我想创建一个372.07 MB大小的文件,

我在Ubuntu 10.08中尝试了以下命令:

dd if=/dev/zero of=output.dat  bs=390143672  count=1
dd: memory exhausted

390143672=372.07*1024*1024

还有其他的方法吗?

非常感谢!

编辑: 在Linux命令行上如何以小数形式查看文件大小。我的意思是,命令行ls -hl只显示:“373M”,但实际上该文件大小为“372.07M”。

4个回答

18

稀疏文件

dd of=output.dat bs=1 seek=390143672 count=0

如果底层文件系统支持的话,这种方法的额外好处是创建了稀疏文件sparse。这意味着,如果某些页面(_blocks)被写入,不会浪费空间,并且创建文件非常快速


非稀疏(不透明)文件:

编辑:因为人们已经正确地指出,稀疏文件具有在某些场景下可能具有不利特性的特点,因此这里是一个完美的折中点:

相反,您可以使用fallocate(由于util-linux而存在于Debian中):

fallocate -l 390143672 output.dat

这种方法仍然有好处,不需要真正编写块数据,因此与创建稀疏文件几乎一样快,但它不是稀疏的。两全其美。


“extremely quick”,但是文件后续的写入是较不可预测的,如果您的分区在此期间填满,则可能失败。(此外,备份工具如何处理您的稀疏文件也要小心。)(但+1,这是一个不错的选项。) - Mat
@sehe 我记得。有人告诉我:“记住dd的默认块大小是512字节”。 - DocWiki
@Mat:好的,基于'fallocate'展示一个'最佳世界'答案(在Debian上测试过)。 - sehe
@sehe:在我的Ubuntu 10.08上,fallocate -l 390143672 output.dat命令会提示fallocate: output.dat: fallocate failed: Operation not supported错误。我正在通过谷歌搜索解决方案。 - DocWiki
@DocWiki:您似乎没有使用支持快速文件分配IOCTL(例如ext4)的文件系统……这很不幸。 - sehe
显示剩余2条评论

7

更改您的参数:

dd if=/dev/zero of=output.dat bs=1 count=390143672

否则,dd会尝试在内存中创建一个370MB的缓冲区。
如果您想更高效地完成操作,请先用相对较大的块(例如1M)编写372MB部分,然后使用seek选项将光标移到文件末尾,并以单个字节块编写剩余部分。
例如:
dd if=/dev/zero of=./output.dat bs=1M count=1
dd if=/dev/zero of=./output.dat seek=1M bs=1 count=42

1
我想知道为什么人们更喜欢这个版本。它确实可以工作,但肯定不是最优的 <whistle/> - sehe
取决于你的目标。备用文件很有趣,但如果你想在文件系统上实际保留空间(也许为了更好地获得磁盘上的大块连续空间),实际写入文件是有帮助的。 - Mat
@Mat 这个解决方案在我的笔记本电脑上太耗时间了。所以在它完成之前我不得不终止它。 - DocWiki
@Matt 有使用 seek 将 0.07M 添加到文件的示例吗? - DocWiki
@Mat:简单是指用户只需输入一个数字,而无需进行任何手动计算。在你的版本中,count=42 不明显且难以在 shell 脚本中推广。 - sehe
显示剩余4条评论

1

truncate - 缩小或扩展文件大小到指定大小

以下示例将putty.log从298字节截断为235字节。

root@ubuntu:~# ls -l putty.log 
-rw-r--r-- 1 root root 298 2013-10-11 03:01 putty.log
root@ubuntu:~# truncate putty.log -s 235
root@ubuntu:~# ls -l putty.log 
-rw-r--r-- 1 root root 235 2013-10-14 19:07 putty.log

0

交换计数和bs。bs字节将在内存中,因此不能太大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接