Bagaimana Anda bisa memotong file menggunakan baris perintah?

18

Apa yang setara dengan konsol dari kode Python berikut:

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

Mungkin beberapa dd mantra? Idenya adalah membuat file dengan ukuran 2 GB untuk digunakan misalnya dalam virtualisasi.

kvm disk -cd whatever.iso #Only allocate space as necessary
badp
sumber
ddadalah satu-satunya alat tradisional yang mengekspos seekpanggilan sistem (lihat dd vs cat - apakah dd masih relevan hari ini? tetapi ada cara lain untuk menguliti kucing ini pada unices saat ini.
Gilles 'SO-stop being evil'

Jawaban:

8

Secara umum, gunakan saja dd; tetapi ketika Anda menyebutkan penggunaan virtualisasi KVM, Anda dapat mempertimbangkan untuk menggunakan qemu-img:

qemu-img create -f raw disk 2G

Itu melakukan hal yang sama dengan ddperintah dalam jawaban Chris Down, secara efektif.

Terlepas dari perintah apa yang Anda gunakan, untuk digunakan dalam virtualisasi, saya sangat menyarankan fallocateuntuk menggunakan pra-alokasi blok untuk mencegah fragmentasi dan meningkatkan kinerja.

fallocate -l 2G disk

Ini tidak tersedia di semua platform dan sistem file. Ini tidak akan menulis nol, tetapi hanya memberikan blok ke file, daripada melakukan itu sesuai permintaan nanti setiap kali harus memperpanjang file.

gertvdijk
sumber
Apakah kutipan itu salah ketik?
badp
@badp ya, sudah diperbaiki.
gertvdijk
2
qemu-imgdan ddkeduanya melakukan satu pemanggilan sistem untuk mengatur ukuran file (ftruncate), tetapi akan melakukan lebih banyak untuk memuat diri mereka sendiri dan perpustakaan yang terhubung dengan mereka. Dan, dalam hal itu, ddakan jauh lebih efektif daripada qemu-img(yang jauh lebih besar dan terkait dengan perpustakaan yang jauh lebih banyak). GNU truncateakan menjadi lebih efektif. ddjuga memiliki keuntungan di mana-mana. Poin bagus tentang itu fallocate.
Stéphane Chazelas
@StephaneChazelas Saya sangat mendukung komentar Anda. Saya telah mengedit jawaban saya untuk menunjukkan bahwa qemu-imgitu hanyalah alternatif yang jelas dalam penggunaan virtualisasi KVM.
gertvdijk
14

Anda dapat membuat file jarang seperti ini dengan dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk
Chris Down
sumber
4
Juga, 2Gadalah ekstensi GNU ke dd. Anda dapat menggunakan bs=1024 seek=2097152jika Anda tidak memiliki GNU dd.
Chris Down
Heh, Gadalah ekstensi, dan itu tidak didukung oleh OpenDD versi OpenDD ... tapi, Mdan Kdidukung, jadi mungkin seek=2048Msedikit lebih mudah dibaca, tergantung pada platform apa yang Anda
targetkan
Anda harus membaca dari / dev / zero: if = / dev / zero
Daniel Fanjul
@DanielFanjul Kenapa? Sama sekali tidak ada perbedaan, tidak ada byte yang ditulis.
Chris Down
@ChrisDown Karena / dev / null tidak berisi data saat Anda membaca, tetapi / dev / zero berisi nol infinte. Oh, hitung = 1, jumlah byte yang ditulis tidak boleh nol.
Daniel Fanjul
6

Lihat juga truncateperintah GNU :

truncate -s 2G some-file
Stéphane Chazelas
sumber