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

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.


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

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,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.