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