Jak przycinać pliki za pomocą wiersza polecenia?

18

Jaki jest konsolowy odpowiednik następującego kodu w języku Python:

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

Może jakieś zaklęcie dd? Pomysł polega na utworzeniu pliku o pozornej wielkości 2 GB do użytku np. W wirtualizacji.

kvm disk -cd whatever.iso #Only allocate space as necessary
badp
źródło
ddjest jedynym tradycyjnym narzędziem, które ujawnia seekwywołanie systemowe (patrz dd vs cat - czy dd jest nadal aktualny? ale istnieją inne sposoby na skórowanie tego kota na typowe obecne jednorożce.
Gilles „SO - przestań być złym”

Odpowiedzi:

8

Ogólnie rzecz biorąc, po prostu użyj dd; ale jak wspominasz o zastosowaniu wirtualizacji KVM, możesz rozważyć użycie qemu-img:

qemu-img create -f raw disk 2G

ddSkutecznie robi to samo, co polecenie w odpowiedzi Chrisa Downa.

Bez względu na to, jakiego polecenia użyjesz, w przypadku wirtualizacji zdecydowanie zalecam użycie fallocatewstępnej alokacji bloków, aby zapobiec fragmentacji i zwiększyć wydajność.

fallocate -l 2G disk

Jednak nie jest dostępny na wszystkich platformach i systemach plików. Nie będzie to zapisywać zer, ale po prostu przypisuje bloki do pliku, zamiast robić to później na żądanie za każdym razem, gdy będzie musiał rozszerzyć plik.

gertvdijk
źródło
Czy cytat jest literówką?
badp,
@badp tak, naprawione.
gertvdijk
2
qemu-imgi ddoba wykonują jedno wywołanie systemowe, aby ustawić rozmiar pliku (ftruncate), ale wykonają znacznie więcej, aby załadować siebie i biblioteki, z którymi są połączone. I pod tym względem ddbędzie znacznie bardziej skuteczny niż qemu-img(który jest znacznie większy i jest powiązany z dużo większą liczbą bibliotek). GNU truncatebędzie jeszcze bardziej skuteczne. ddma również tę zaletę, że jest wszechobecny. Dobra racja fallocatejednak.
Stéphane Chazelas,
@StephaneChazelas Całkowicie popieram twój komentarz. Zredagowałem swoją odpowiedź, aby wskazać, że qemu-imgjest to po prostu oczywista alternatywa w zastosowaniu wirtualizacji KVM.
gertvdijk
14

Możesz utworzyć taki rzadki plik za pomocą dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk
Chris Down
źródło
4
Ponadto 2Gjest rozszerzeniem GNU do dd. Możesz użyć, bs=1024 seek=2097152jeśli nie masz GNU dd.
Chris Down,
Heh, Gjest rozszerzeniem i nie jest obsługiwane przez wersję dd OpenBSD ... ale Mi Ksą obsługiwane, więc może seek=2048Mjest nieco bardziej czytelny, w zależności od platform, na które
celujesz
Powinieneś czytać z / dev / zero: if = / dev / zero
Daniel Fanjul,
@DanielFanjul Dlaczego? Nie ma absolutnie żadnej różnicy, żadne bajty nie są zapisywane.
Chris Down,
@ChrisDown Ponieważ / dev / null nie zawiera danych podczas czytania, ale / dev / zero zawiera nieskończone zera. Och, count = 1, liczba bajtów do zapisu nie może wynosić zero.
Daniel Fanjul,
6

Zobacz także truncatepolecenie GNU :

truncate -s 2G some-file
Stéphane Chazelas
źródło