コマンドラインを使用してファイルをトリミングするにはどうすればよいですか?


18

次のPythonコードに相当するコンソールは何ですか:

target = file("disk", "w")    # create a file
target.seek(2*1024*1024*1024) # skip to 2 GB
target.write("\0")
target.close()

多分DDの呪文?このアイデアは、仮想化などで使用するために、見かけのサイズが2 GBのファイルを作成することです。

kvm disk -cd whatever.iso #Only allocate space as necessary

dd公開する唯一の伝統的なツールであるseekシステムコール(SEE 猫対DDは-これらの日まだ関連DDです?が、皮膚への他の方法は、この猫は、典型的な現在のUnix系OS上であります。
ジル「SO-停止されて悪」

回答:


8

一般的に、使用するだけddです。ただし、KVM仮想化の使用について言及しているように、次の使用を検討することもできますqemu-img

qemu-img create -f raw disk 2G

ddクリスダウンの回答のコマンドと実質的に同じです。

使用するコマンドに関係なく、仮想化で使用する場合、fallocate断片化を防ぎパフォーマンスを向上させるためにブロックを事前に割り当てることを強くお勧めします。

fallocate -l 2G disk

ただし、すべてのプラットフォームとファイルシステムで利用できるわけではありません。これはゼロを書き込まず、ファイルを拡張する必要があるたびにオンデマンドでそれを行うのではなく、ファイルにブロックを割り当てるだけです。


引用はタイプミスですか?
badp

@badpはい、修正されました。
gertvdijk

2
qemu-imgそして、ddの両方を行う1つのファイルサイズ(ftruncateの)を設定するためのシステムコールを、それ自体と、彼らはにリンクされているライブラリをロードするために、より多くのことを実行します。そして、その点で、(はるかに大きく、はるかに多くのライブラリにリンクされている)よりもはるかにdd効果的ですqemu-img。GNU truncateはさらに効果的になります。ddユビキタスであるという利点もあります。約良い点fallocate
ステファンシャゼル

@StephaneChazelasあなたのコメントを完全に二番目にしています。私は回答を編集して、それqemu-imgがKVM仮想化の使用における明らかな代替手段にすぎないことを指摘しました。
gertvdijk

14

次のようにして、このようなスパースファイルを作成できますdd

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk

4
また、2GのGNU拡張機能ddです。bs=1024 seek=2097152GNUがない場合に使用できますdd
クリスダウン

へぇ、G拡張機能であり、それはDDのOpenBSDのバージョンでサポートされていない...しかし、MおよびKサポートされているので、多分seek=2048Mもう少し読みやすい、あなたはしているが、標的にどのようなプラットフォームに依存
Earlz

/ dev / zeroから読み取る必要があります:if = / dev / zero
Daniel Fanjul

@DanielFanjulなぜですか?まったく違いはなく、バイトも書き込まれません。
クリスダウン

@ChrisDown読み取り時に/ dev / nullにはデータが含まれていないが、/ dev / zeroには無限のゼロが含まれているため。ああ、count = 1、書き込むバイト数はゼロであってはなりません。
ダニエルファンジュル

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