ファイルを必要なサイズで埋めるにはどうすればよいですか?

ファイルを必要なサイズで埋めるにはどうすればよいですか?

16MiB(16777216バイト)に達するまで埋めたいファイルがあります。現在16515072バイトです。違いは262144バイトです。

どのようにパディングしますか?

これはうまくいかないようです:

cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144

答え1

seek物理パディングに答える代わりに、ファイルの新しい端に単一の文字を作成して、ファイルのパディングスペースの大部分を空にする(「穴」)ことができます。

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

stdoutを削除of=largerfile.txtしてファイルに追加します。

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を引いてそのバイトより前の位置を見つけます。ルックアップ位置のインデックスがゼロなので、もう一方は削除します。

関連情報