¿Cómo puedes recortar archivos usando la línea de comando?

18

¿Cuál es el equivalente de la consola del siguiente código de Python?

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

Tal vez algún dd encantamiento? La idea es crear un archivo con el tamaño aparente de 2 GB para usar, por ejemplo, en la virtualización.

kvm disk -cd whatever.iso #Only allocate space as necessary
badp
fuente
ddes la única herramienta tradicional que expone la seekllamada al sistema (ver dd vs cat - ¿dd sigue siendo relevante en estos días? pero hay otras formas de desollar a este gato en los dispositivos actuales típicos)
Gilles 'SO- deja de ser malvado'

Respuestas:

8

En términos generales, solo use dd; pero al mencionar el uso de la virtualización KVM, podría considerar usar qemu-img:

qemu-img create -f raw disk 2G

Hace lo mismo que el ddcomando en la respuesta de Chris Down, efectivamente.

Independientemente del comando que use, para usar en la virtualización, sugeriría encarecidamente usarlo fallocatepara preasignar bloques para evitar la fragmentación y aumentar el rendimiento.

fallocate -l 2G disk

Sin embargo, no está disponible en todas las plataformas y sistemas de archivos. Esto no escribirá ceros, sino que solo asignará bloques al archivo, en lugar de hacerlo a pedido cada vez que tenga que extender el archivo.

gertvdijk
fuente
¿Es la cita un error tipográfico?
badp
@badp sí, arreglado.
gertvdijk
2
qemu-imgy ddambos realizan una llamada al sistema para establecer el tamaño del archivo (ftruncate), pero realizarán mucho más para cargarse y las bibliotecas a las que están vinculados. Y, en ese sentido, ddserá mucho más efectivo que qemu-img(que es mucho más grande y está vinculado a muchas más bibliotecas). GNU truncateva a ser aún más efectivo. ddTambién tiene la ventaja de ser omnipresente. Buen punto sobre fallocatesin embargo.
Stéphane Chazelas
@StephaneChazelas Apoyo totalmente tu comentario. He editado mi respuesta para señalar que qemu-imges solo una alternativa obvia en el uso de la virtualización KVM.
gertvdijk
14

Puede crear un archivo disperso como este con dd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk
Chris Down
fuente
44
Además, 2Ges una extensión de GNU para dd. Puedes usarlo bs=1024 seek=2097152si no tienes GNU dd.
Chris Down
Je, Ges una extensión, y no es compatible con la versión de dd de OpenBSD ... pero, My Kes compatible, por lo que tal vez seek=2048Msea ​​un poco más legible, dependiendo de las plataformas a las que se
dirija
Debería leer de / dev / zero: if = / dev / zero
Daniel Fanjul
@DanielFanjul ¿Por qué? No hay absolutamente ninguna diferencia, no se escriben bytes.
Chris Down
@ChrisDown Porque / dev / null no contiene datos cuando lee, pero / dev / zero contiene ceros infinitos. Oh, cuenta = 1, el número de bytes a escribir no debe ser cero.
Daniel Fanjul
6

Vea también el truncatecomando GNU :

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