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. Gegenwärtig kopiere ich manuell das Einfügen von Zeilen in dieselbe Datei, um die Größe zu erhöhen.
command-line
Nisheet
quelle
quelle
mkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; done
?Antworten:
Es gibt eine einfache Möglichkeit, eine Zeile viele Male zu wiederholen:
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
head
die-c
Option 's' anstelle von-n
. Dies erzeugt zum Beispiel genau 10 kB Text:quelle
head -c 10000
10 kB anstelle von 10head -n 10000
k Zeilen.Ich kann nicht empfehlen , Text unendlich zu wiederholen, aber Sie könnten mit Python eine ~ 2-GB-Datei mit wiederholtem Text wie folgt erstellen ...
Dadurch wird 10 Mal "Hallo Welt" gedruckt, eine neue Zeile erstellt und diese 20.000.000 Mal wiederholt, wobei das Ergebnis in die Datei geschrieben wird
bigfile
. 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. Mir geht der Arbeitsspeicher aus, wenn ich versuche, mehr als 10.000.000 Zeilen zu schreiben ...
Ich lasse zwar einen Toaster laufen
quelle
Perl hat den cleveren
x
Operator:Als einfache Lösung können Sie Ihre Zeile also ein paar Millionen Mal schreiben. Mit diesem Befehl wurde beispielsweise eine 3G-Datei erstellt:
Wenn Sie eine genaue Größe angeben müssen (in diesem Fall 2 GiB), können Sie Folgendes tun:
quelle
Fügen Sie die zu wiederholenden Wörter in eine Datei ein, z
source.txt
. Holen Sie sich die Größe dersource.txt
, in Bytes zB durch:Legen Sie die Größe der Zieldatei fest, z. B.
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
Fließkomma-Arithmetik ist nicht möglich, wird aber in diesem Fall nicht benötigt.Verwenden Sie ein
for
Konstrukt, um einecat source.txt
Operation die Divisionsergebniszeiten zu wiederholen . Dies entspricht in etwa der Größe der Zieldatei, die Sie durch Wiederholung erhalten können. Die Ausgabe der Operation wird in gespeichertdestination.txt
.Angenommen, die Größe
source.txt
beträgt 30 Byte, und wir möchten eine 2-GB-Datei erstellen, dann benötigen wir:Hier setze ich die Obergrenze zum
((16777216/30))
Zeitpunkt der Initialisierung; Sie können das Ergebnis auch hier abrufen.Die Operation würde einige Zeit dauern; Je größer
source.txt
, desto weniger Zeit wird benötigt.quelle
destination.txt
einmal für jede Iteration der Schleife?Sie können auch eine
while
-Schleife verwenden.Beispiel: Inhalt von
foo.txt
(Dies ist Ihre Quelle):bar.txt
ist leer (Dies ist Ihre Zieldatei). Sie können jetzt die folgende Schleife verwenden, um den Inhaltfoo.txt
mehrmals zu schreibenbar.txt
:Erläuterung:
stat --format "%s" bar.txt
Zeigt die Größebar.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 vonfoo.txt
anbar.txt
quelle
Feuer zuerst den Befehl:
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.
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:
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:
Hier sind einige weitere Zahlen, die Ihnen den Einstieg erleichtern sollen:
quelle
FIFOs sind wahrscheinlich das, wonach Sie suchen. Anstatt Ihr Programm mit einer bestimmten Datei aufzurufen, können Sie das Ergebnis eines Shell-Befehls über die Prozesssubstitution an das Programm binden, 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:
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.
quelle