ファイルを希望のサイズにパディングする方法は?


15

16 MiB(16777216バイト)に達するまでパディングしたいファイルがあります。現在、16515072バイトです。違いは262144バイトです。

どうすればパッドできますか?

これは機能していないようです:

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

2
@terabyte; 物理的なパディングまたは論理的なパディングが必要ですか?言い換えると; ファイルは16777216のサイズのみを表示する必要があります(また、穴を含む場合があります)か、ディスク上のそのストレージ量も占有する必要がありますか?-ところで、bs=1インを選択することddは私の経験では非常にランタイムが高価です。
ジャニス

5
truncate -s 16M thefile
frostschutz

4
@frostschutzが良い答えだと思いますが、それを答えとして投稿してください。
デロベルト

@ derobert、StackExchangeサイトユーザーが正当な簡単な回答をコメントとして投稿しているのは何ですか?
user1717828

@ user1717828わからない、おそらくメタの良い質問です。
デロバート

回答:


10

ドロップしてof=largerfile.txt、stdoutをファイルに追加します。

dd if=/dev/zero bs=1 count=262144 >> largerfile.txt

1
seekここで正しいオプションです。
0andriy

15

物理的なパディングを取得するための答えに加えて、ファイル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

3
正しい。この場合truncate -s +262144 largerfile.txtも高速です。
-don_crissti

4

ここで最高の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バイトに切り捨てますが、これが最後に穴を作成することを望んでいる場合、最初に穴の後にデータを書き込み、後でデータを含まないサイズに切り捨てる必要があるため、間違っています。
気味悪い

count = 0は、countパラメーターを指定しないことに似ています。それdd if=/dev/zero of=somefileは同じだと言っていdd if=/dev/zero of=somefile count=0ますか?それを試してみてください。
PeteC

もちろん!count=0 であるあなたがすべてでカウントパラメータを指定しなかった場合と同じ。これは、少なくとも元のソースから派生したすべての実装に当てはまります。試してみてくださいdd。元のコマンドを使用したことがないようです。
気味悪い

count「このパラメーターを無視する」という意味の一意の値として0を指定するドキュメントは見つかりません。見つけられますか?そのような文書がなければ、count=0「ゼロブロックを書き込む」ことを意味し、これからの逸脱はバグです...(元のソースまたはいいえ)。
PeteC

1
これは、指定不足のテキストが修正された2015年5月以前のPOSIXドキュメントです。
18

1

使用する必要があります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を減算してそのバイトの前の位置をシークします。シーク位置はインデックスがゼロであるため、もう一方を削除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.