我有一个文件想要填充直到它达到 16 MiB(16777216 字节)。目前为 16515072 字节。差异为 262144 字节。
我该如何垫它?
这似乎不起作用:
cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144
答案1
seek
除了获得物理填充的答案之外,您还可以通过ing 到文件的新结束位置并写入单个字符,将文件中的大部分填充空间保留为空(“孔”) :
dd if=/dev/zero of=largerfile.txt bs=1 count=1 seek=16777215
(其优点是性能更高,特别是在使用时bs=1
,并且不占用大量额外的磁盘空间)。
即使不添加任何字符,通过使用if=/dev/null
最终所需的文件大小,该方法似乎也可以工作:
dd if=/dev/null of=largerfile.txt bs=1 count=1 seek=16777216
使用更大块大小的物理填充解决方案的高性能变体是:
padding=262144 bs=32768 nblocks=$((padding/bs)) rest=$((padding%bs))
{
dd if=/dev/zero bs=$bs count=$nblocks
dd if=/dev/zero bs=$rest count=1
} 2>/dev/null >>largerfile.txt
答案2
删除of=largerfile.txt
stdout 并将其附加到文件中:
dd if=/dev/zero bs=1 count=262144 >> largerfile.txt
答案3
简单的答案,由 @frostschutz 提供,作为答案发布
truncate -s 16M thefile
答案4
你必须使用吗dd
?如果您希望文件具有特定的(逻辑)长度,只需在您想要的位置写入零即可。前一个结尾和写入字节之间的字节将显示为具有空字节。这是一个使用 perl 的示例。
$ echo Hello > file
$ ls -l file
-rw-r--r-- 1 user group 6 Apr 16 22:59 file
$ perl -le 'open(my $f,"+<","file"); seek($f, 16777216 - 2, 0); print $f "\0"'
$ ls -ln file
-rw-r--r-- 1 user group 16777216 Apr 16 22:59 file
为什么行中要加“-2”?该脚本将写入一个字节,因此我们减 1 以查找该字节之前的位置。我们去掉另一个,因为查找位置是零索引的。