16 MiB(16777216バイト)に達するまでパディングしたいファイルがあります。現在、16515072バイトです。違いは262144バイトです。
どうすればパッドできますか?
これは機能していないようです:
cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144
truncate -s 16M thefile
16 MiB(16777216バイト)に達するまでパディングしたいファイルがあります。現在、16515072バイトです。違いは262144バイトです。
どうすればパッドできますか?
これは機能していないようです:
cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144
truncate -s 16M thefile
回答:
物理的なパディングを取得するための答えに加えて、ファイル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
truncate -s +262144 largerfile.txt
も高速です。
ここで最高のanwserは、現在のファイルサイズを忘れて、計算なしで目的のサイズに直接パディングできるため、Janis(上記)です。
また、/ dev / zeroを追加しないスパースファイルを利用します。
ただし、 'count'は0でも許可され、パディングが得られるため、答えはより整然とすることができます。
dd if=/dev/null of=largerfile.txt bs=1 count=0 seek=16777216
(編集:これはGNU ddには正しいですが、動作count=0
はプラットフォーム固有です。コメントを参照してください)
count=0
ませんが、通常はcount
パラメーターが指定されていないときと同じです。その他の問題:dd
ファイルを16777216バイトに切り捨てますが、これが最後に穴を作成することを望んでいる場合、最初に穴の後にデータを書き込み、後でデータを含まないサイズに切り捨てる必要があるため、間違っています。
dd if=/dev/zero of=somefile
は同じだと言っていdd if=/dev/zero of=somefile count=0
ますか?それを試してみてください。
count=0
であるあなたがすべてでカウントパラメータを指定しなかった場合と同じ。これは、少なくとも元のソースから派生したすべての実装に当てはまります。試してみてくださいdd
。元のコマンドを使用したことがないようです。
count
「このパラメーターを無視する」という意味の一意の値として0を指定するドキュメントは見つかりません。見つけられますか?そのような文書がなければ、count=0
「ゼロブロックを書き込む」ことを意味し、これからの逸脱はバグです...(元のソースまたはいいえ)。
使用する必要があります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を減算してそのバイトの前の位置をシークします。シーク位置はインデックスがゼロであるため、もう一方を削除します。
bs=1
インを選択することdd
は私の経験では非常にランタイムが高価です。