¿Cómo crear un archivo grande en UNIX?

17

Encontré una manera en Windows para hacer tal cosa

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

¿Hay alguna manera en UNIX para copiar un archivo, agregarlo y luego repetir el proceso? Algo como for .. cat file1.txt > file1.txt?

Thomas Lee
fuente
¿Por qué copiar el archivo y agregarlo en lugar de solo agregarlo?
123
@ 123 append es bueno, pero ¿cómo hacer el bucle?
Thomas Lee
44
for i in {1..1000000};do echo "string" >> file;doneen fiesta
123
9
¿Tiene que ser un archivo de texto? Puede hacer cualquier tamaño de archivo desde / dev / zero o / dev / urandom.
RealSkeptic
2
Esperaría type file >> filecorrer en un bucle infinito (al menos tan pronto como sea lo suficientemente grande como para que no quepa en un búfer).
Stéphane Chazelas

Respuestas:

29
yes "Some text" | head -n 100000 > large-file

Con csh/ tcsh:

repeat 10000 echo some test > large-file

Con zsh:

{repeat 10000 echo some test} > large-file

En sistemas GNU, vea también:

seq 100000 > large-file

O:

truncate -s 10T large-file

(crea un archivo disperso de 10TiB (muy grande pero no ocupa espacio en el disco)) y las otras alternativas discutidas en "Crear un archivo de prueba con muchos cero bytes" .


Hacerlo cat file >> filesería una mala idea.

Primero, no funciona con algunas catimplementaciones que se niegan a leer archivos que son iguales a su archivo de salida. Pero incluso si lo soluciona haciendo cat file | cat >> file, si filees más grande que catel búfer interno, eso haría que se catejecutara en un bucle infinito, ya que terminaría leyendo los datos que ha escrito anteriormente.

En los sistemas de archivos respaldados por un disco duro giratorio, también sería bastante ineficiente (después de alcanzar un tamaño mayor que el que posiblemente se almacenaría en la memoria caché) ya que el disco necesitaría ir y venir entre la ubicación donde leer los datos, y que donde escribirlo.

Stéphane Chazelas
fuente
19
O dd if=/dev/zero of=large-file bs=1024 count=1024para un archivo de 1 MB
doneal24
77
@ DougO'Neal Me parece dd if=/dev/zero of=test bs=1M count=1más claro.
123
44
@ DougO'Neal, vea Crear un archivo de prueba con muchos bytes cero
Stéphane Chazelas
1
O use / dev / urandom en lugar de / dev / zero si desea datos aleatorios.
user253751
3
@ robertotomás sí, todos lo usan dd, pero nunca he entendido por qué. De hecho, creo que solo lo he usado para leer un MBR o tareas similares. En mi experiencia, otras herramientas son más rápidas, más simples y más seguras para la gran mayoría de los casos en que las personas usan dd. Creo que este es uno de esos casos donde común! = Óptimo, como sudo suo cat file | grep foo.
terdon
22

Puede crear un archivo grande en Solaris usando:

mkfile 10g /path/to/file

Otra forma que funciona en Solaris (y Linux):

truncate -s 10g /path/to file

También es posible usar:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240
Lambert
fuente
dd uno es como un terabyte
123
1
Definir "un archivo grande" :-) Pero he editado ya que las otras muestras todos indican 10g ...
Lambert
truncate No se puede ejecutar 'truncar'. No existe tal archivo o directorio Truncate parece ser solo Linux.
schily
truncateexiste en Solaris 11.2+
Lambert
11

La forma más rápida posible de crear un archivo grande en un sistema Linux es fallocate:

sudo fallocate -l 2G bigfile

fallocatemanipula el sistema de archivos y, en realidad, no escribe en los sectores de datos de manera predeterminada, y como tal es extremadamente rápido. La desventaja es que debe ejecutarse como root.

Ejecutándolo sucesivamente en un bucle, puede llenar el mayor de los sistemas de archivos en cuestión de segundos.

Desde man fallocate

Fallocate se utiliza para manipular el espacio en disco asignado para un archivo, ya sea para desasignarlo o preasignarlo.
Para los sistemas de archivos que admiten la llamada al sistema de Falcocate, la preasignación se realiza rápidamente asignando bloques y marcándolos como no inicializados, sin requerir IO a los bloques de datos. Esto es mucho más rápido que crear un archivo al llenarlo con ceros.
Compatible con XFS (desde Linux 2.6.38), ext4 (desde Linux 3.0), Btrfs (desde Linux 3.7) y tmpfs (desde Linux 3.5).

Rui F Ribeiro
fuente
1
Esta debería ser la respuesta aceptada. Fácil y rapido.
ardochhigh
8

Esto continuará hasta que CTRL-C:

yes This is stuff that I want to put into my file... >> dummy.txt

Sin embargo, tenga cuidado, porque puede obtener cientos de miles de líneas / segundo ...

De man yes:

yes - output a string repeatedly until killed
Questionmark
fuente
Este es un método muy fácil para crear un archivo grande en un entorno Linux.
Chaminda Bandara
1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtte dejaría obtener una cantidad precisa. (-n $ TARGET_NUMBER_OF_LINES). yesmoriría automáticamente como resultado de una 'tubería rota' cuando headtermina porque se ha alcanzado el número objetivo.
PypeBros
4

Si te entiendo correctamente, estás buscando algo como:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

Eso creará un archivo con 22 repeticiones de "línea de prueba". Si desea un tamaño de archivo específico, puede usar algo como esto (en Linux). 1024 es un kilobyte:

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

Personalmente, cuando quiero crear un archivo grande, utilizo dos archivos y cat uno en el otro. Puede repetir el proceso hasta alcanzar el tamaño deseado (1 MB aquí):

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

Tenga en cuenta que esta solución a menudo excederá el tamaño deseado porque si el archivo está por debajo del límite, todo se incluirá nuevamente.

Finalmente, si todo lo que desea es un archivo del tamaño deseado y no necesita que contenga nada, puede usar truncate:

truncate -s 1M file
terdon
fuente
1
Sin catembargo, ¿ el archivo tiene alguna ventaja para agregarlo? Parecería que llevaría más tiempo ya que tiene que bifurcar dos procesos en cada ciclo y también mover todo el contenido varias veces.
123
1
@ 123 velocidades. El catenfoque es mucho, mucho más rápido. Solo tiene sentido crear archivos enormes, pero eso creó un archivo de 545M en 10 segundos en mi máquina. El mismo whilebucle con echo "test line" >> filecreó un archivo de 96K en la misma cantidad de tiempo.
terdon
Supongo que lo que pasa con el enfoque de "gato" es que crece exponencialmente. Al comenzar la segunda iteración, 'newfile' ya tiene 1 línea y 'file' tiene 2, y cuando se hace, 'newfile' ahora tiene 3 líneas y 'file' es 5. Luego, 'newfile' será 8 y ' archivo 'será 13. Siguiente (21, 34), etc.
PypeBros
inconveniente: puede tomar más espacio en disco (> = 1.5 * tamaño deseado) que el tamaño del archivo de destino mientras se crea el archivo.
PypeBros
por cierto. Si tiene truncatealrededor, puede truncate -s 1Gcrear el archivo en primer lugar. unix.stackexchange.com/a/269184/85549 . Puede reemplazarlo por un head -c $DESIRED_SIZE, posiblemente dentro del whilebucle.
PypeBros
3

Al canalizar el contenido de /dev/urandoma head, puede redirigir la salida a un archivo, de modo que:

 cat /dev/urandom | head --bytes=100 >> foo.bar

Le dará un archivo con 100 bytes de basura.

gastador
fuente
1
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

mismo efecto de su script de Windows pero en bash, no puede concatenar un archivo consigo mismo, directamente.

MelBurslan
fuente
Además de olvidar la .txtextensión, dejarás 2 archivos grandes al final.
ott--