Wie erstelle ich eine große Datei unter UNIX?

17

Ich habe in Windows einen Weg gefunden, so etwas zu tun

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/

Gibt es in UNIX eine Möglichkeit, eine Datei zu kopieren, anzufügen und den Vorgang dann zu wiederholen? So etwas wie for .. cat file1.txt > file1.txt?

Thomas Lee
quelle
Warum die Datei kopieren und anhängen, anstatt nur anzuhängen?
123
@ 123 anhängen ist gut, aber wie macht man die Schleife?
Thomas Lee
4
for i in {1..1000000};do echo "string" >> file;donein bash.
123.
9
Muss es eine Textdatei sein? Sie können Dateien jeder Größe aus / dev / zero oder / dev / urandom erstellen.
RealSkeptic
2
Ich würde erwarten type file >> file, in einer Endlosschleife zu laufen (zumindest sobald es groß genug ist, dass es nicht in einen Puffer passt).
Stéphane Chazelas

Antworten:

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

Mit csh/ tcsh:

repeat 10000 echo some test > large-file

Mit zsh:

{repeat 10000 echo some test} > large-file

Zu GNU-Systemen siehe auch:

seq 100000 > large-file

Oder:

truncate -s 10T large-file

(Erstellt eine 10-TB-Sparse-Datei (sehr groß, nimmt aber keinen Speicherplatz auf der Festplatte ein)) und die anderen unter "Erstellen einer Testdatei mit vielen Null-Bytes" beschriebenen Alternativen .


Tun cat file >> filewäre eine schlechte Idee.

Erstens funktioniert es nicht mit einigen catImplementierungen, die das Lesen von Dateien verweigern, die mit ihrer Ausgabedatei identisch sind. Aber selbst wenn Sie es umgehen cat file | cat >> file, wenn filees größer als catder interne Puffer ist, würde dies dazu führen, dass es catin einer Endlosschleife ausgeführt wird, da es am Ende die Daten liest, die es zuvor geschrieben hat.

Auf Dateisystemen, die von einer rotierenden Festplatte gesichert werden, wäre dies ebenfalls ziemlich ineffizient (nach Erreichen einer Größe, die größer ist als die, die möglicherweise im Speicher zwischengespeichert wird), da das Laufwerk zwischen dem Ort, an dem die Daten gelesen werden sollen, hin und her wechseln müsste. und das wo man es schreibt.

Stéphane Chazelas
quelle
19
Oder dd if=/dev/zero of=large-file bs=1024 count=1024für eine 1MB-Datei
doneal24
7
@ DougO'Neal finde dd if=/dev/zero of=test bs=1M count=1ich klarer.
123
4
@ DougO'Neal, siehe Erstellen einer Testdatei mit vielen Null-Bytes
Stéphane Chazelas
1
Oder verwenden Sie / dev / urandom anstelle von / dev / zero, wenn Sie zufällige Daten wünschen.
user253751
3
@ robertotomás ja, jeder nutzt dd, aber ich habe nie verstanden warum. In der Tat denke ich, ich habe es immer nur verwendet, um einen MBR oder ähnliche Randaufgaben zu lesen. Nach meiner Erfahrung sind andere Tools in den allermeisten Fällen, in denen Benutzer sie verwenden, schneller, einfacher und sicherer dd. Ich denke, dies ist einer jener Fälle, in denen häufig! = Optimal, wie sudo suoder cat file | grep foo.
terdon
22

Sie können unter Solaris eine große Datei erstellen, indem Sie Folgendes verwenden:

mkfile 10g /path/to/file

Ein anderer Weg, der unter Solaris (und Linux) funktioniert:

truncate -s 10g /path/to file

Es ist auch möglich:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240
Lambert
quelle
dd man ist wie ein Terabyte
123
1
Definiere "eine große Datei" :-) Aber ich habe seit den anderen Samples alle State 10g bearbeitet ...
Lambert
truncate 'truncate' kann nicht ausgeführt werden. Keine solche Datei oder kein solches Verzeichnis scheint nur Linux zu sein.
Schily
truncategibt es unter Solaris 11.2+
Lambert
11

Der schnellste Weg, eine große Datei in einem Linux-System zu erstellen, ist fallocate:

sudo fallocate -l 2G bigfile

fallocatemanipuliert das Dateisystem und schreibt standardmäßig nicht wirklich in die Datensektoren und ist daher extrem schnell. Der Nachteil ist, dass es als root ausgeführt werden muss.

Wenn Sie es nacheinander in einer Schleife ausführen, können Sie das größte Dateisystem in Sekundenschnelle füllen.

Von man fallocate

fallocate wird verwendet, um den zugewiesenen Speicherplatz für eine Datei zu bearbeiten, entweder um die Zuordnung aufzuheben oder um sie vorab zuzuweisen.
Bei Dateisystemen, die den Systemaufruf fallocate unterstützen, erfolgt die Vorbelegung schnell, indem Blöcke zugewiesen und als nicht initialisiert markiert werden, ohne dass eine E / A für die Datenblöcke erforderlich ist. Dies ist viel schneller als das Erstellen einer Datei durch Füllen mit Nullen.
Unterstützt für XFS (seit Linux 2.6.38), ext4 (seit Linux 3.0), Btrfs (seit Linux 3.7) und tmpfs (seit Linux 3.5).

Rui F Ribeiro
quelle
1
Dies sollte die akzeptierte Antwort sein. Einfach und schnell.
Ardochhigh
8

Dies wird so lange fortgesetzt, bis Sie STRG-C:

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

Seien Sie vorsichtig, denn Sie können Hunderttausende von Zeilen pro Sekunde erhalten ...

Von man yes:

yes - output a string repeatedly until killed
Fragezeichen
quelle
Dies ist eine sehr einfache Methode, um eine große Datei in einer Linux-Umgebung zu erstellen.
Chaminda Bandara
1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtwürden Sie genaue Menge bekommen. (-n $ TARGET_NUMBER_OF_LINES). yeswürde automatisch als Ergebnis eines "Rohrbruchs" sterben, wenn headterminiert wird, weil die Zielnummer erreicht wurde.
PypeBros
4

Wenn ich Sie richtig verstehe, suchen Sie nach etwas wie:

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

Dadurch wird eine Datei mit 22 Wiederholungen der "Testzeile" erstellt. Wenn Sie eine bestimmte Dateigröße wünschen, können Sie so etwas verwenden (unter Linux). 1024 ist ein Kilobyte:

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

Persönlich, wenn ich eine große Datei erstellen möchte, verwende ich zwei Dateien und katze eine in die andere. Sie können den Vorgang wiederholen, bis Sie die gewünschte Größe erreicht haben (1 MB hier):

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

Beachten Sie, dass diese Lösung häufig die gewünschte Größe überschreitet. Wenn die Datei unter dem Grenzwert liegt, wird alles erneut in die Datei gecattet.

Wenn Sie nur eine Datei der gewünschten Größe benötigen, die eigentlich nichts enthalten muss, können Sie Folgendes verwenden truncate:

truncate -s 1M file
terdon
quelle
1
Hat es cattatsächlich einen Vorteil, die Datei nur anzuhängen? Es scheint, als würde es länger dauern, da zwei Prozesse in jeder Schleife gespalten werden müssen und außerdem der gesamte Inhalt mehrmals verschoben werden muss.
123
1
@ 123 Geschwindigkeit. Der catAnsatz ist viel, viel schneller. Es macht nur Sinn, große Dateien zu erstellen, aber das hat eine 545M-Datei in 10 Sekunden auf meinem Computer erstellt. Die gleiche whileSchleife mit echo "test line" >> fileeiner 96K - Datei in dem gleichen Zeitbetrag angelegt.
terdon
Ich denke, die Sache mit dem "Katze" -Ansatz ist, dass es exponentiell wächst. Beim Starten der zweiten Iteration hat 'newfile' bereits 1 Zeile und 'file' 2 Zeilen, und wenn dies erledigt ist, hat 'newfile' jetzt 3 Zeilen und 'file' 5 Zeilen. Als nächstes ist 'newfile' 8 und ' Datei 'wird 13. Nächste (21, 34), etc.
PypeBros
Nachteil: Es kann mehr Speicherplatz (> = 1,5 * Gewünschte_Größe) als die Zieldateigröße beanspruchen, während die Datei erstellt wird.
PypeBros
btw. Wenn Sie in der truncateNähe sind, können Sie truncate -s 1Gdie Datei an erster Stelle erstellen. unix.stackexchange.com/a/269184/85549 . Sie könnten es durch ein ersetzen head -c $DESIRED_SIZE, möglicherweise innerhalb der whileSchleife.
PypeBros
3

Durch Weiterleiten des Inhalts von /dev/urandomto können headSie die Ausgabe in eine Datei umleiten.

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

Gibt Ihnen eine Datei mit 100 Bytes Müll.

Spender
quelle
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

Der gleiche Effekt Ihres Windows-Skripts, aber in Bash können Sie eine Datei nicht direkt mit sich selbst verknüpfen.

MelBurslan
quelle
Abgesehen davon .txt, dass Sie die Erweiterung vergessen haben , hinterlassen Sie am Ende zwei große Dateien.
ott--