如何使用命令行修剪文件?


18

等同于以下Python代码的控制台是什么:

target = file("disk", "w")    # create a file
target.seek(2*1024*1024*1024) # skip to 2 GB
target.write("\0")
target.close()

也许有些dd咒语?这个想法是制作一个表面大小为2 GB的文件,以用于虚拟化。

kvm disk -cd whatever.iso #Only allocate space as necessary

dd是公开的唯一传统工具seek的系统调用(参见DD VS猫-为DD仍然具有现实意义,这些天,但还有其他的方法对皮肤这只猫的典型电流Unix系统。
吉尔“SO-停止作恶”

Answers:


8

一般来说,只是使用dd;但是当您提到使用KVM虚拟化时,您可以考虑使用qemu-img

qemu-img create -f raw disk 2G

dd与Chris Down的答案中的命令有效地相同。

无论在虚拟化中使用什么命令,我都强烈建议使用fallocate预分配块,以防止碎片并提高性能。

fallocate -l 2G disk

但是,它并非在所有平台和文件系统上都可用。这不会写入零,而只是将块分配给文件,而不是在每次扩展文件时按需进行。


报价是错字吗?
badp 2012年

@badp是的,已修复。
gertvdijk 2012年

2
qemu-imgdd都执行一个系统调用来设置文件大小(ftruncate),但将进行更多的加载自己和他们联系到库。并且,在这方面,dd它将比qemu-img(这要大得多,并且链接到更多的库)要有效得多。GNU truncate将更加有效。dd还具有无处不在的优势。很好的一点fallocate
斯特凡Chazelas

@StephaneChazelas我完全赞同您的评论。我已经编辑了答案,指出这qemu-img只是使用KVM虚拟化的一个明显替代方案。
gertvdijk 2012年

14

您可以使用以下方法创建一个稀疏文件dd

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk

4
另外,2G是的GNU扩展ddbs=1024 seek=2097152如果没有GNU,可以使用dd
克里斯·

嘿,G是扩展,它不受OpenBSD的dd版本的支持...但是,M并且K受支持,因此也许seek=2048M更具可读性,具体取决于您定位的平台
Earlz 2012年

您应该阅读/ dev / zero:if = / dev / zero
Daniel Fanjul 2012年

@DanielFanjul为什么?绝对没有区别,没有字节被写入。
克里斯·

@ChrisDown因为在读取时/ dev / null不包含任何数据,但是/ dev / zero包含无穷零。哦,count = 1,要写入的字节数不能为零。
Daniel Fanjul 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.