¿Cómo crear un archivo con un tamaño dado en Linux?

157

Para fines de prueba, tengo que generar un archivo de cierto tamaño (para probar un límite de carga).

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

Grundlefleck
fuente
gran tamaño stackoverflow.com/questions/257844/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

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

¿Dónde file_sizeestá el tamaño de su archivo de prueba en bytes?

Ilya Kochetov
fuente
Oh, eso podría ser más eficiente que mi enfoque porque lo hace todo en un bloque. Buena idea.
Paul Tomblin
10
En realidad, el uso de un gran tamaño de bloque funcionará mucho peor una vez que sea 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
35
ddtiene un límite de 2 ^ 32 por sus valores, por lo que para crear un archivo de más de 4 GB, hay un truco: dd if=/dev/zero of=test bs=1M count=<size in megabytes>.
Dmytro Sirenko
2
Vea la siguiente respuesta para un enfoque mejor y más rápido
dados elegantes
2
@elegantdice no está claro qué respuesta es la siguiente, pueden cambiar su posición
vladkras
160

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

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

Es necesario decir que truncateen un sistema de archivos que admite archivos dispersos creará un archivo disperso y fallocateno lo hará. Un archivo disperso es aquel en el que las unidades de asignación que componen el archivo no se asignan realmente hasta que se usan. Sin embargo, los metadatos para el archivo ocuparán un espacio considerable, pero probablemente no cerca del tamaño real del archivo. Debe consultar recursos sobre archivos dispersos para obtener más información, ya que existen ventajas y desventajas para este tipo de archivo. Un archivo no disperso tiene sus bloques (unidades de asignación) asignados con anticipación, lo que significa que el espacio está reservado hasta donde el sistema de archivos lo ve. Además fallocate, ni truncateno se establecerá el contenido del archivo a un valor especificado como dd, en cambio, el contenido de un archivo asignado con fallocateo truncatepuede ser cualquier valor de papelera que haya existido en las unidades asignadas durante la creación y este comportamiento puede o no ser deseado. El ddes el más lento porque en realidad escribe el valor o el fragmento de datos en toda la secuencia de archivos como se especifica con sus opciones de línea de comandos.

Este comportamiento podría ser 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 aconseja que se realice una investigación adecuada para garantizar que se utilice el método apropiado.

jørgensen
fuente
Probé truncate. Produjo un archivo de tamaño cero usando la sintaxis anterior. La 'página de manual' fallocatedice que los archivos que crea están llenos de spacedatos vacíos en lugar de datos. Parece que no sería útil para algunos casos esperados como "cuánto tiempo lleva copiar un archivo 1G".
Mark Stosberg
66
Falocate parece funcionar bien para mí. Crea un archivo del tamaño correcto.
Aater Suleman
55
Esta es la mejor respuesta a esta pregunta. El truncamiento / Fallacate no toma mucho tiempo, porque no escribe todos los bloques del archivo. Pero, si luego cargara el archivo resultante en algún lugar, leería ceros para todo.
Mike Andrews
44
Si desea ejecutar este en OSX, entonces usted necesita para hacer esto: brew install coreutils. Esto añadirá un g delante del comando, así que hay que ejecutarlo como esto: gtruncate -s 10G foo. ¡Espero que esto ayude!
DerekE
Parece que no funciona en una NTFSpartición.
eloyesp
40

Solo para seguir la publicación de Tom , también puedes usar dd para crear archivos dispersos:

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

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

Brian
fuente
Establecer count = 0 evita tener que restar un byte del tamaño del archivo.
andrewdotn
3
con count=0, se bs * seekconvierte en el tamaño del archivo
Jayen
24

En OSX (y Solaris, aparentemente), el mkfilecomando también está disponible:

mkfile 10g big_file

Esto crea un archivo de 10 GB llamado "big_file". Encontré este enfoque aquí.

Steve
fuente
Esto es útil para situaciones como OS X donde los comandos truncatey fallocateno están disponibles. ddTambién funciona como se describió anteriormente, aunque no es mpara megabytes M.
user535673
Incorrecto: Esto crea un archivo de 10 GiB (= ~ 10,7 GB).
postre
20

Usa este comando:

dd if = $ ARCHIVO DE ENTRADA de = $ ARCHIVO DE SALIDA bs = $ BLOCK-SIZE count = $ NUM-BLOCKS

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

Grundlefleck
fuente
¿Por qué hiciste la pregunta?
Henry B
9
Tuve que buscar la respuesta en Google, así que lo puse aquí, para poder discutirlo y mantenerlo actualizado ... ¿sabes, el punto de todo el sitio?
Grundlefleck
2
Sé que la gente está votando a @Grundlefleck por la prostitución de XP, pero él tiene un punto: una de las formas de usar este sitio como lo imaginaron Jeff y Joel es hacer una pregunta y responder por algo que acabas de descubrir.
Paul Tomblin
3
Gracias paul Aunque no estoy tan preocupado por los puntos, estoy preocupado por las cosas que encuentro en Google que pueden estar defectuosas de alguna manera que nunca descubriría a menos que pregunte aquí. Las personas deben sentirse libres de hacer que mi comunidad Q / A sea propiedad si piensan que estoy burlándome, se encoge de hombros .
Grundlefleck
2
Para citar las preguntas frecuentes "También está perfectamente bien preguntar y responder a su propia pregunta de programación, pero simule que está en peligro: formúlela en forma de pregunta".
Craig Angus
17

Puedes 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 enfoque es especialmente útil para posteriormente mapear el archivo en la memoria.

use el siguiente comando para verificar que el archivo tenga el tamaño correcto:

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

Ten cuidado:

# du /tmp/foo.txt

probablemente imprimirá 0 porque se asigna como archivo Sparse si es compatible con su sistema de archivos

ver también: hombre 2 abierto y hombre 2 truncado

Benedikt Waldvogel
fuente
10

Podrías hacerlo:

[dsm@localhost:~]$ perl -e 'print "\0" x 100' > filename.ext

Donde reemplaza 100 con el número de bytes que desea escribir.

dsm
fuente
Y el byte de llenado real también. Necesito "\ xff" y funciona bien. ¡Gracias! :)
Ray
10

Algunas de estas respuestas lo tienen usando /dev/zeropara la fuente de sus datos. Si prueba las velocidades de carga de la red, puede que esta no sea la mejor idea si su aplicación está haciendo alguna compresión, un archivo lleno de ceros se comprime muy bien. Usando este comando para generar el archivo

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

Podría comprimir upload_testhasta unos 200 bytes. Por lo tanto, podría ponerse en una situación en la que cree que está cargando un archivo de 10 KB, pero en realidad sería mucho menos.

Lo que sugiero es usar en /dev/urandomlugar de /dev/zero. No pude comprimir la salida de /dev/urandommucho en absoluto.

devin
fuente
Mi sistema integrado no tiene /dev/zero, por lo que /dev/urandomes bueno.
Fredrick Gauss
9
dd if=/dev/zero of=my_file.txt count=12345
Paul Tomblin
fuente
44
Recuerde que el tamaño de bloque predeterminado de dd es de 512 bytes, por lo que este comando creará un archivo de 12345 * 512 bytes.
nadie
4

Hay muchas respuestas, pero ninguna explicó bien qué más se puede hacer. Buscando en las páginas man para dd , es posible especificar mejor el tamaño de un archivo.

Esto va a crear /tmp/zero_big_data_file.bin lleno 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.bin lleno de 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, bs es el tamaño de bloque y count es el número de bloques
  • Los BLOQUES 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.
BЈовић
fuente
3

Como comando de shell:

< /dev/zero head -c 1048576 >  output
usuario1772090
fuente
3

Esto generará un archivo de texto de 4 MB 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
Berkay92
fuente
0

Úselo fallocatesi no quiere esperar al disco.

Ejemplo:

fallocate -l 100G BigFile

Uso:

Usage:
 fallocate [options] <filename>

Preallocate space to, or deallocate space from a file.

Options:
 -c, --collapse-range remove a range from the file
 -d, --dig-holes      detect zeroes and replace with holes
 -i, --insert-range   insert a hole at range, shifting existing data
 -l, --length <num>   length for range operations, in bytes
 -n, --keep-size      maintain the apparent size of the file
 -o, --offset <num>   offset for range operations, in bytes
 -p, --punch-hole     replace a range with a hole (implies -n)
 -z, --zero-range     zero and ensure allocation of a range
 -x, --posix          use posix_fallocate(3) instead of fallocate(2)
 -v, --verbose        verbose mode

 -h, --help           display this help
 -V, --version        display version
qin
fuente