如何将文件填充到所需的大小?

如何将文件填充到所需的大小?

我有一个文件想要填充直到它达到 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.txtstdout 并将其附加到文件中:

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 以查找该字节之前的位置。我们去掉另一个,因为查找位置是零索引的。

相关内容