2008-09-26 16 views
116

Para fines de prueba, tengo que generar un archivo de un cierto tamaño (para probar un límite de carga).¿Cómo crear un archivo con un tamaño dado en Linux?

¿Qué es un comando para crear un archivo de cierto tamaño en Linux?

+0

gran tamaño http://stackoverflow.com/questions/257844/quickly-create-a-large-file-on-a-linux-system –

Respuesta

147
dd if=/dev/zero of=upload_test bs=file_size count=1 

Dónde file_size es el tamaño de su archivo de prueba en bytes

+0

Oh, eso podría ser más eficiente que mi enfoque porque lo hace todo en un solo bloque. Buena idea. –

+9

En realidad, usar un gran tamaño de bloques funcionará mucho peor una vez que se vuelve muy grande, ya que asignará y leerá esa cantidad en la memoria antes de escribir. Si esto es algo así como bs = 4GiB, probablemente termines intercambiando. – Brian

+0

¿Qué tal si usas un archivo como plantilla y copias su comienzo (con 'head -c file_size> desired_file') o su finalización (con' tail -c file_size> desired_file')? ¿Sería más rápido? También sería "aleatorio". – Carcamano

19

Use este comando:

 
dd if=$INPUT-FILE of=$OUTPUT-FILE bs=$BLOCK-SIZE count=$NUM-BLOCKS 

Para crear un archivo de gran tamaño (vacío), establece $INPUT-FILE=/dev/zero.
El tamaño total del archivo será $BLOCK-SIZE * $NUM-BLOCKS.
El nuevo archivo creado será $OUTPUT-FILE.

+0

¿Por qué se hace la pregunta? –

+8

Tuve que buscar la respuesta de Google, así que lo puse aquí, para que pueda ser discutido y actualizado ... ya sabes, ¿el objetivo de todo el sitio? – Grundlefleck

+2

Sé que la gente está votando a @Grundlefleck por las prostituciones de XP, pero tiene un punto: una de las maneras de usar este sitio como lo concibieron Jeff y Joel es poner una pregunta y responder por algo que acaba de descubrir. –

9
dd if=/dev/zero of=my_file.txt count=12345 
+4

Recuerde que el tamaño de bloque predeterminado de dd es de 512 bytes, por lo que este comando hará que un archivo tenga un tamaño de 12345 * 512 bytes. –

10

que podría hacer:

[[email protected]:~]$ perl -e 'print "\0" x 100' > filename.ext 

Cuando reemplace 100 con el número de bytes que desea volcar.

+0

Y el byte de relleno real también. Necesito "\ xff" y funciona bien. ¡Gracias! :) – Ray

37

Sólo para dar seguimiento a Tom's posterior, puede utilizar dd para crear archivos dispersos, así:

dd if=/dev/zero of=the_file bs=1 count=0 seek=12345 

Esto creará un archivo con un "orificio" en la mayoría de las Unixes: los datos no se escribirán en el disco, o ocuparán espacio hasta que se escriba algo distinto de cero.

+0

Configuración de recuento = 0 evita tener que restar un byte del tamaño del archivo. – andrewdotn

+0

Así lo hace. Gracias, lo he actualizado. – Brian

+3

con 'count = 0',' bs * seek' se convierte en el tamaño de archivo – Jayen

16

Puede hacerlo mediante programación:

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdlib.h> 

int main() { 
    int fd = creat("/tmp/foo.txt", 0644); 
    ftruncate(fd, SIZE_IN_BYTES); 
    close(fd); 
    return 0; 
} 

Este método es especialmente útil para posteriormente mmap el archivo en memoria.

utilizar el siguiente comando para comprobar que el archivo tiene el tamaño correcto:

# du -B1 --apparent-size /tmp/foo.txt 

Tenga cuidado:

# du /tmp/foo.txt 

probablemente imprimir porque se asigna como Sparse file si apoyado por su sistema de archivos.

ver también: man 2 open y man 2 truncate

-1

supongo que el enfoque más eficaz implicaría crear el archivo con open (con las banderas O_CREAT y O_WRONLY, a menos que desee leer el archivo en el mismo programa) y el ajuste el tamaño con ftruncate.

18

en OSX (y Solaris, al parecer), el comando mkfile está disponible, así:

mkfile 10g big_file 

Esto hace que un archivo de 10 GB llamado "big_file".Encontrado este enfoque here.

+0

Esto es útil para situaciones como OS X donde los comandos 'truncate' y' fallocate' no están disponibles. 'dd' también funciona como se describe arriba aunque es' m' para megabytes, no 'M'. – user535673

130

Por favor, moderno es más fácil y más rápido. En Linux, (escoger uno)

truncate -s 10G foo 
fallocate -l 5G bar 

Se necesita a afirmar que truncate en un sistema de archivos que soporte archivos dispersos creará un archivo disperso y fallocate no lo hará. Un archivo disperso es aquel en el que las unidades de asignación que componen el archivo no son realmente asignadas hasta que se usen. Los metadatos para el archivo serán, sin embargo, ocuparán un espacio considerable, pero probablemente no estén cerca del tamaño real del archivo. Debe consultar los recursos sobre los archivos dispersos para obtener más información, ya que existen ventajas y desventajas para este tipo de archivo. Un archivo no disperso tiene asignados sus bloques (unidades de asignación) con anticipación, lo que significa que el espacio está reservado en la medida en que lo vea el sistema de archivos. También fallocate ni truncate no va a fijar el contenido del archivo a un valor especificado comodd, en vez del contenido de un archivo asignado con fallocate o truncate puede ser cualquier valor de la basura que existía en las unidades asignadas durante la creación y este comportamiento puede o puede no ser deseado. El dd es el más lento porque en realidad escribe el valor o el fragmento de datos en todo el flujo de archivos como se especifica con sus opciones de línea de comando.

Este comportamiento podría ser potencialmente diferente, dependiendo del sistema de archivos utilizado y la conformidad de ese sistema de archivos con cualquier estándar o especificación. Por lo tanto, se recomienda realizar una investigación adecuada para garantizar que se utiliza el método apropiado.

+0

Intenté 'truncar'. Produjo un archivo de tamaño cero utilizando la sintaxis anterior.La 'página de manual' de 'fallocate' dice que los archivos que crea están llenos de' espacio 'vacío en lugar de datos. Parece que no sería útil para algunos casos esperados, como "cuánto tiempo lleva copiar un archivo 1G". –

+6

fallocate parece funcionar bien para mí. Crea un archivo del tamaño correcto. –

+4

Esta es la mejor respuesta a esta pregunta. El truncate/fallocate no toma mucho tiempo, porque no escribe todos los bloques del archivo. Pero, si tuviera que subir el archivo resultante a alguna parte, leería ceros para todo el asunto. –

3

Como comando shell:

< /dev/zero head -c 1048576 > output 
8

Algunas de estas respuestas has utilizando /dev/zero para la fuente de los datos. Si la red de prueba carga velocidades, esta puede no ser la mejor idea si su aplicación está haciendo alguna compresión, un archivo lleno de ceros comprime realmente. El uso de este comando para generar el archivo

dd if=/dev/zero of=upload_test bs=10000 count=1 

pude comprimir upload_test abajo a cerca de 200 bytes. Así que podrías ponerte en una situación en la que creas que estás cargando un archivo de 10 KB pero en realidad sería mucho menos.

Lo que sugiero es usar /dev/urandom en lugar de /dev/zero. No pude comprimir mucho la salida de /dev/urandom.

+0

Mi sistema incorporado no tiene '/ dev/zero', entonces'/dev/urandom' es bueno. –

3

Hay muchas respuestas, pero ninguna explica muy bien qué más se puede hacer. Examinando man pages for dd, es posible especificar mejor el tamaño de un archivo.

Esto va a crear /tmp/zero_big_data_file.bin llena de ceros, que tiene un tamaño de 20 megabytes:

dd if=/dev/zero of=/tmp/zero_big_data_file.bin bs=1M count=20 

Esto va a crear/tmp/zero_1000bytes_data_file.compartimiento llenado con ceros, que tiene un tamaño de 1000 bytes:

dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin bs=1kB count=1 

o

dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin bs=1000 count=1 

  • En todos los ejemplos, sa es tamaño de bloque, y el recuento es el número de bloques de
  • BLOCKS y BYTES pueden ir seguidos de los siguientes sufijos multiplicativos: c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024, y así sucesivamente para T, P, E, Z, Y.
2

Esto generará 4 MB archivo de texto con caracteres aleatorios en el directorio actual y su nombre "4mb.txt" Puede cambiar los parámetros para generar diferentes tamaños y nombres.

base64 /dev/urandom | head -c 4000000 > 4mb.txt 
Cuestiones relacionadas