it-swarm.com.de

Wie erstelle ich eine Datei vom Terminal aus, indem ich eine Reihe von Wörtern unendlich wiederhole?

Wie erstelle ich eine Datei vom Terminal aus, indem ich eine Reihe von Wörtern unendlich wiederhole? Ich brauche es, um eine riesige Datei für Analysezwecke wie 2-4 GB Größe zu erstellen. Momentan kopiere ich manuell das Einfügen von Zeilen in dieselbe Datei, um die Größe zu erhöhen.

19
Nisheet

Es gibt eine einfache Möglichkeit, eine Zeile viele Male zu wiederholen:

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

das Ergebnis ist out.txt mit 10.000 Zeilen, in denen "Wir haben keine Bananen" steht.


Um die Ausgabe auf eine genaue Anzahl von Bytes zu beschränken, verwenden Sie die Option _-c_ von head anstelle von _-n_. Dies erzeugt zum Beispiel genau 10 kB Text:

_yes we have no bananas | head -c 10000 > out.txt
_
50
hobbs

Ich kann nicht empfehlen, nendlich Text zu wiederholen, aber Sie könnten eine ~ 2-GB-Datei mit wiederholtem Text mit python wie folgt erstellen ...

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

Das wird "Hallo Welt" 10 Mal drucken und eine neue Zeile machen und diese 20.000.000 Mal wiederholen, wobei das Ergebnis in die Datei bigfile geschrieben wird. Wenn alle Ihre Zeichen ASCII-Zeichen sind, entspricht jedes einem Byte. Berechnen Sie also entsprechend den Angaben, die Sie schreiben möchten.

Ihre CPU kann im Besitz sein. Ich habe keinRAMmehr, wenn ich versuche, mehr als 10.000.000 Zeilen zu schreiben ...

Ich lasse zwar einen Toaster laufen

10
Zanna

Perl hat den raffinierten Operator x:

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

Als einfache Lösung können Sie Ihre Zeile also ein paar Millionen Mal schreiben. Mit diesem Befehl wurde beispielsweise eine 3G-Datei erstellt:

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

Wenn Sie eine genaue Größe angeben müssen (in diesem Fall 2 GiB), können Sie Folgendes tun:

Perl -e 'use bytes; while(length($str)<2<<20){ $str.="This is my line\n"} print "$str\n"' > file
9
terdon
  • Fügen Sie die zu wiederholenden Wörter in eine Datei ein, z. source.txt. Liefert die Größe des source.txt in Bytes, z.B. durch:

     stat -c '%s' source.txt
    
  • Legen Sie die Größe der Zieldatei fest, z. destination.txt, 2 GB oder 4 GB oder was auch immer. Konvertieren Sie die Größe in Bytes.

  • Teilen Sie die Größe der Zieldatei durch die Größe der Quelldatei. bash kann keine Gleitkomma-Arithmetik ausführen, wird aber in diesem Fall nicht benötigt.

  • Verwenden Sie ein for -Konstrukt, um eine cat source.txt -Operation zu wiederholen. Dies entspricht in etwa der Größe der Zieldatei, die Sie durch Wiederholung erhalten können. Die Ausgabe der Operation wird in destination.txt gespeichert.

Angenommen, der source.txt hat 30 Byte und wir möchten eine 2-GB-Datei erstellen, dann benötigen wir:

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

Hier setze ich die Obergrenze durch ((16777216/30)) zur Initialisierungszeit; Sie können das Ergebnis auch hier abrufen.

Die Operation würde einige Zeit dauern; Je größer der source.txt, desto weniger Zeit wird benötigt.

7
heemayl

Sie können auch eine while- Schleife verwenden.

Beispiel: Inhalt von foo.txt (Dies ist Ihre Quelle):

foo
bar
foobar

bar.txt ist leer (Dies ist Ihre Zieldatei). Sie können jetzt die folgende Schleife ausführen, um den Inhalt von foo.txt mehrmals in bar.txt zu schreiben:

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

Erläuterung:

  • stat --format "%s" bar.txt zeigt die Größe von bar.txt in Bytes an.
  • while [ $(stat --format "%s" bar.txt) -lt 150 ] Die folgenden Aktionen werden wiederholt, bis die Zielgröße (in diesem Fall 150 Byte) erreicht ist.
  • cat foo.txt >> bar.txt füge den Inhalt von foo.txt an bar.txt an
6
Wayne_Yux

FIFOs sind wahrscheinlich das, wonach Sie suchen. Anstatt Ihr Programm mit einer bestimmten Datei aufzurufen, können Sie das Ergebnis eines Shell-Befehls mit Prozesssubstitution verknüpfen, und das Programm sieht seine Ausgabe als Klartextdatei. Der Vorteil hierbei ist, dass Sie nicht mehr an Ihren Festplattenspeicher gebunden sind, sodass Sie Dateigrößen erreichen können, die andernfalls unmöglich wären, solange Ihr Programm nicht die gesamte Datei zuerst puffern und sie einfach zeilenweise analysieren muss. Verwenden Sie zum Beispiel die Antwort von @hobbs, um Inhalte zu generieren:

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

Dies verleiht mir eine 95-Gigabyte-Datei (laut wc) ohne Kosten auf der Festplatte und kaum RAM, gerade genug, um das, was der Befehl zurückgibt, zu puffern, bevor es gelesen wird. Dies ist ungefähr so ​​nah an "unendlich", wie Sie bekommen werden.

4
Santo Guevarra

feuer zuerst den Befehl:

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

erstellt eine Datei auf einem Pfad der Größe bs * count zufällige Bytes, in unserem Fall 2048 * 10 = 20 KB. das kann je nach Anforderung geändert werden.

cat - > file.txt

Dieser Befehl leitet STDIN in eine Datei um. Sie müssen also zwei Zeilen eingeben und dann Strg + D drücken. Dann müssen Sie den folgenden Befehl ausführen:

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

Wobei n eine ganze Zahl ist. Dadurch wird eine Datei mit 2 ^ (n + 1) Zeilen erstellt, indem die ursprünglichen zwei Zeilen dupliziert werden. So erstellen Sie eine Datei mit 16 Zeilen:

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

Hier sind einige weitere Zahlen, die Ihnen den Einstieg erleichtern sollen:

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)
4
Avani badheka