¿Cómo crear un archivo desde la terminal repitiendo un conjunto de palabras infinitamente?

19

¿Cómo crear un archivo desde la terminal repitiendo un conjunto de palabras infinitamente? Lo necesito para crear un archivo enorme para propósitos de análisis como 2-4GB de tamaño. Actualmente estoy copiando manualmente las líneas de pegado en el mismo archivo para aumentar el tamaño.

    
pregunta Nisheet 27.09.2016 - 05:55

7 respuestas

49

Hay una manera fácil de repetir una línea muchas veces:

yes we have no bananas | head -n 10000 > out.txt

dará como resultado out.txt que contiene 10,000 líneas y todas dicen "no tenemos bananas".

Para limitar la salida a un número exacto de bytes, use la opción head 's -c en lugar de -n . Por ejemplo, esto genera exactamente 10 kB de texto:

yes we have no bananas | head -c 10000 > out.txt
    
respondido por el hobbs 27.09.2016 - 07:53
10

No puedo recomendar infinitamente repetir texto, pero podrías hacer un archivo de ~ 2GB de texto repetido con Python como ese ...

python3 -c 'with open("bigfile", "w") as f: f.write(("hello world "*10+"\n")*2*10**7)'

Eso imprimirá "hello world" 10 veces y creará una nueva línea, y lo repetirá 20,000,000 de veces, escribiendo el resultado en el archivo bigfile . Si todos sus caracteres son ASCII, entonces cada uno es un byte, así que calcule de manera apropiada según lo que quiera escribir ...

Su CPU puede ser propiedad. Me quedo sin RAM si trato de hacer más de 10,000,000 de líneas ...

Estoy ejecutando una tostadora sin embargo

    
respondido por el Zanna 27.09.2016 - 06:21
9

Perl tiene el ingenioso operador x :

$ perl -e 'print "foo\n" x 5'
foo
foo
foo
foo
foo

Entonces, como solución simple, podría escribir su línea unos pocos millones de veces. Por ejemplo, este comando creó un archivo 3G:

perl -e 'print "This is my line\n" x 200000000' > file

Si necesita especificar un tamaño exacto (2 GiB en este caso), puede hacerlo:

perl -e 'use bytes; while(length($str)<2<<20){ $str.="This is my line\n"} print "$str\n"' > file
    
respondido por el terdon 27.09.2016 - 10:42
7
  • Ponga el conjunto de palabras a repetir en un archivo, p. %código%. Obtenga el tamaño del source.txt , en bytes p. Ej. por:

     stat -c '%s' source.txt
    
  • Decida el tamaño del archivo de destino, p. source.txt , 2 GB o 4 GB o lo que sea. Convierta el tamaño en bytes.

  • Divida el tamaño del archivo de destino por el tamaño del archivo de origen. destination.txt no puede hacer aritmética de punto flotante, pero no es necesario en este caso.

  • Usa un constructo bash para repetir una operación for los tiempos de resultado de división. Esta sería la aproximación más aproximada del tamaño del archivo de destino que puede obtener por repetición. La salida de la operación se guarda en cat source.txt .

Por ejemplo, suponiendo que destination.txt es de 30 bytes, y queremos crear un archivo de 2 GB, necesitamos:

for ((i=0; i<=((16777216/30)); i++)); do cat source.txt; done >destination.txt

Aquí estoy configurando el límite superior en source.txt en el momento de la inicialización; puedes obtener el resultado y ponerlo aquí también.

La operación llevaría algún tiempo; cuanto mayor sea el ((16777216/30)) , menos tiempo se necesitará.

    
respondido por el heemayl 27.09.2016 - 06:25
6

También puedes usar while -loop.

Ejemplo: Contenido de foo.txt (Esta es su fuente):

foo
bar
foobar

bar.txt está vacío (este es su archivo de destino). Ahora puede ejecutar el siguiente ciclo para escribir el contenido de foo.txt varias veces en bar.txt :

while [ $(stat --format "%s" bar.txt) -lt 150 ] 
do 
    cat foo.txt >> bar.txt
done

Explicación:

  • stat --format "%s" bar.txt muestra el tamaño de bar.txt en bytes.
  • while [ $(stat --format "%s" bar.txt) -lt 150 ] las siguientes acciones se repetirán hasta que se alcance el tamaño objetivo (en este caso, 150 bytes).
  • cat foo.txt >> bar.txt agrega el contenido de foo.txt a bar.txt
respondido por el Wayne_Yux 27.09.2016 - 07:52
4

primero de disparar el comando:

dd if=/dev/urandom of=file.txt bs=2048 count=10

creará un archivo en la ruta de tamaño bs * conteo de bytes aleatorios, en nuestro caso 2048 * 10 = 20Kb. que se puede cambiar según los requisitos.

cat - > file.txt

Este comando redirige a STDIN a un archivo, por lo que deberá ingresar dos líneas y luego presionar Ctrl + D. Luego deberá ejecutar el siguiente comando:

for i in {1..n}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done

Donde n es un número entero. Esto creará un archivo con 2 ^ (n + 1) líneas en él, duplicando sus dos líneas originales. Entonces, para crear un archivo con 16 líneas, haría:

for i in {1..3}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done

Aquí hay algunos más números para comenzar:

n=15 will give you 65536 lines (if the original two lines were 'hello' and 'world' the file will be 384Kb)
n=20 will give you 2097152 lines (12Mb file with 'hello' and 'world' as the two starting lines)
n=25 will give you 67108864 lines (384Mb file with 'hello' and 'world' as the two starting lines)
    
respondido por el Avani badheka 27.09.2016 - 06:22
4

FIFOs son probablemente lo que estás buscando. En lugar de llamar a su programa con un archivo dado, puede vincular el resultado de un comando de shell a través del proceso de sustitución y el programa verá su salida como un archivo de texto plano. La ventaja aquí es que ya no está limitado por su espacio en disco, por lo que puede alcanzar tamaños de archivos que de otro modo serían imposibles, siempre que su programa no necesite almacenar primero todo el archivo y pueda analizarlo línea por línea. Por ejemplo, usando la respuesta de @hobbs para generar contenido:

wc -c <(yes we have no bananas | head -n 5000000000)

Esto me proporciona un archivo de 95 gigabytes (de acuerdo con wc) sin costo en el espacio HDD y apenas RAM, lo suficiente para almacenar lo que el comando devuelve antes de que se lea. Esto es lo más cercano a "infinitamente" que va a obtener.

    
respondido por el Santo Guevarra 28.09.2016 - 17:35

Lea otras preguntas en las etiquetas