Wie erstelle ich eine Datei mit einer bestimmten Größe unter Linux?

156

Zu Testzwecken muss ich eine Datei einer bestimmten Größe generieren (um ein Upload-Limit zu testen).

Was ist ein Befehl zum Erstellen einer Datei einer bestimmten Größe unter Linux?

Grundlefleck
quelle
große stackoverflow.com/questions/257844/…
Ciro Santilli 郝海东 冠状 病 病 六四 法轮功

Antworten:

186
dd if=/dev/zero of=upload_test bs=file_size count=1

Wo file_sizeist die Größe Ihrer Testdatei in Bytes?

Ilya Kochetov
quelle
Oh, das könnte effizienter sein als mein Ansatz, weil es alles in einem Block erledigt. Gute Idee.
Paul Tomblin
10
Tatsächlich ist die Verwendung einer großen Blockgröße viel schlechter, wenn sie sehr groß wird, da diese Menge vor dem Schreiben zugewiesen und in den Speicher eingelesen wird. Wenn dies so etwas wie bs = 4GiB ist, werden Sie wahrscheinlich am Ende tauschen.
Brian
34
ddDie Werte sind auf 2 ^ 32 begrenzt. Um eine Datei mit mehr als 4 GB zu erstellen, gibt es einen Trick : dd if=/dev/zero of=test bs=1M count=<size in megabytes>.
Dmytro Sirenko
2
Siehe nächste Antwort für einen besseren, schnelleren Ansatz
elegante Würfel
2
@elegantdice es ist nicht klar, welche Antwort als nächstes kommt, sie können ihre Position ändern
vladkras
160

Bitte, modern ist einfacher und schneller. Unter Linux (wählen Sie eine aus)

truncate -s 10G foo
fallocate -l 5G bar

Es muss angegeben werden, dass truncateauf einem Dateisystem, das Sparse-Dateien unterstützt, eine Sparse-Datei erstellt wird und fallocatenicht. Eine Datei mit geringer Dichte ist eine , wo die Zuordnungseinheiten, die die Datei bilden, werden nicht tatsächlich bis zur Verwendung zugeordnet. Die Meta-Daten für die Datei wird dauern jedoch einige viel Platz, aber wahrscheinlich nicht annähernd der tatsächlichen Größe der Datei. Weitere Informationen finden Sie in den Ressourcen zu Dateien mit geringer Dichte, da dieser Dateityp Vor- und Nachteile hat. Bei einer nicht spärlichen Datei werden die Blöcke (Zuordnungseinheiten) vorab zugewiesen, was bedeutet, dass der Speicherplatz für das Dateisystem reserviert ist. Auch fallocatenoch truncatewird der Inhalt der Datei nicht auf einen bestimmten Wert wie gesetzt ddAnstatt den Inhalt einer Datei zugeordnet mit fallocateoder truncatekann ein ungenutzter Wert sein, der in den zugeteilten Einheiten während der Erstellung und dieses Verhalten existiert nicht erwünscht sein oder auch nicht . Das ddist die langsamste , weil es tatsächlich den Wert oder Teil der Daten auf die gesamte Datei - Stream schreibt wie mit seinen Befehlszeilenoptionen angegeben.

Dieses Verhalten kann möglicherweise unterschiedlich sein - abhängig vom verwendeten Dateisystem und der Konformität dieses Dateisystems mit einem Standard oder einer Spezifikation. Daher wird empfohlen, angemessene Untersuchungen durchzuführen, um sicherzustellen, dass die geeignete Methode angewendet wird.

jørgensen
quelle
Ich habe es versucht truncate. Es wurde eine Datei mit der Größe Null unter Verwendung der obigen Syntax erstellt. Die 'Manpage' für fallocatebesagt, dass die von ihr erstellten Dateien spaceeher leer als Daten sind. Es scheint, dass es für einige erwartete Fälle wie "Wie lange dauert das Kopieren einer 1G-Datei" nicht sinnvoll wäre.
Mark Stosberg
6
Fallocate scheint für mich gut zu funktionieren. Es wird eine Datei mit der richtigen Größe erstellt.
Aater Suleman
5
Dies ist die beste Antwort auf diese Frage. Das Abschneiden / Fallocate dauert nicht lange, da nicht alle Blöcke der Datei geschrieben werden. Wenn Sie dann die resultierende Datei irgendwo hochladen würden, würde sie Nullen für die gesamte Sache lesen.
Mike Andrews
4
Wenn Sie dies unter OSX ausführen möchten, müssen Sie Folgendes tun : brew install coreutils. Dadurch wird vor dem Befehl ein g eingefügt, sodass Sie es wie folgt ausführen müssen : gtruncate -s 10G foo. Hoffe das hilft!
DerekE
Es scheint, dass es auf einer NTFSPartition nicht funktioniert .
Eloyesp
40

Um Toms Beitrag zu verfolgen , können Sie mit dd auch spärliche Dateien erstellen:

dd if=/dev/zero of=the_file bs=1 count=0 seek=12345

Dadurch wird bei den meisten Unixen eine Datei mit einem "Loch" erstellt. Die Daten werden erst dann auf die Festplatte geschrieben oder belegen Speicherplatz, wenn etwas anderes als Null darauf geschrieben wird.

Brian
quelle
Wenn Sie count = 0 setzen, müssen Sie kein Byte von der Dateigröße abziehen.
Andrewdotn
3
mit count=0, bs * seekwird die Dateigröße
Jayen
24

Unter OSX (und anscheinend Solaris) ist der mkfileBefehl ebenfalls verfügbar:

mkfile 10g big_file

Dadurch wird eine 10-GB-Datei mit dem Namen "big_file" erstellt. Fand diesen Ansatz hier.

Steve
quelle
Dies ist nützlich für Situationen wie OS X, in denen die Befehle truncateund fallocatenicht verfügbar sind. ddfunktioniert auch wie oben beschrieben, obwohl es mfür Megabyte ist, nicht M.
user535673
Falsch: Dadurch wird eine 10- GiB- Datei (= ~ 10,7 GB) erstellt.
Nachtisch
20

Verwenden Sie diesen Befehl:

dd if = $ INPUT-FILE von = $ OUTPUT-FILE bs = $ BLOCK-SIZE count = $ NUM-BLOCKS

Um eine große (leere) Datei zu erstellen, setzen Sie $INPUT-FILE=/dev/zero.
Die Gesamtgröße der Datei beträgt $BLOCK-SIZE * $NUM-BLOCKS.
Neue Datei erstellt wird $OUTPUT-FILE.

Grundlefleck
quelle
Warum hast du die Frage gestellt?
Henry B
9
Ich musste bei Google nach der Antwort suchen, also habe ich sie hier eingefügt, damit sie diskutiert und auf dem neuesten Stand gehalten werden kann ... wissen Sie, worum es auf der gesamten Website geht?
Grundlefleck
2
Ich weiß, dass die Leute @Grundlefleck für XP-Huren stimmen, aber er hat einen Punkt - eine der Möglichkeiten, diese Site zu nutzen, wie von Jeff und Joel vorgesehen, besteht darin, eine Frage und Antwort für etwas zu stellen, das Sie gerade entdeckt haben.
Paul Tomblin
3
Danke Paul. Obwohl ich mich nicht so sehr um die Punkte kümmere, kümmere ich mich um Dinge, die ich bei Google finde und die auf irgendeine Weise fehlerhaft sein könnten, von der ich nichts erfahren würde, wenn ich nicht hier gefragt hätte. Die Leute sollten sich frei fühlen, meine Q / A-Community in Besitz zu nehmen, wenn sie denken, ich hure, zuckt die Achseln .
Grundlefleck
2
Um aus den FAQs zu zitieren: "Es ist auch vollkommen in Ordnung, Ihre eigene Programmierfrage zu stellen und zu beantworten, aber tun Sie so, als wären Sie in Gefahr: Formulieren Sie sie in Form einer Frage."
Craig Angus
17

Sie können dies programmgesteuert tun:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main() {
    int fd = creat("/tmp/foo.txt", 0644);
    ftruncate(fd, SIZE_IN_BYTES);
    close(fd);
    return 0;
}

Dieser Ansatz ist besonders nützlich , um anschließend mmap die Datei in den Speicher.

Verwenden Sie den folgenden Befehl, um zu überprüfen, ob die Datei die richtige Größe hat:

# du -B1 --apparent-size /tmp/foo.txt

Achtung:

# du /tmp/foo.txt

wird wahrscheinlich 0 drucken, da es als Sparse-Datei zugewiesen wird, wenn es von Ihrem Dateisystem unterstützt wird.

siehe auch: Mann 2 offen und Mann 2 abgeschnitten

Benedikt Waldvogel
quelle
10

du könntest es tun:

[dsm@localhost:~]$ perl -e 'print "\0" x 100' > filename.ext

Wo Sie 100 durch die Anzahl der Bytes ersetzen, die Sie schreiben möchten.

dsm
quelle
Und das eigentliche Füllbyte auch. Ich brauche "\ xff" und funktioniert gut. Vielen Dank! :)
Ray
10

Einige dieser Antworten verwenden Sie /dev/zeroals Quelle für Ihre Daten. Wenn Sie die Upload-Geschwindigkeit Ihres Netzwerks testen, ist dies möglicherweise nicht die beste Idee, wenn Ihre Anwendung eine Komprimierung durchführt. Eine Datei voller Nullen wird sehr gut komprimiert . Verwenden Sie diesen Befehl, um die Datei zu generieren

 dd if=/dev/zero of=upload_test bs=10000 count=1

Ich könnte upload_testauf ungefähr 200 Bytes komprimieren . Sie könnten sich also in eine Situation versetzen, in der Sie denken, dass Sie eine 10-KB-Datei hochladen, aber es wäre tatsächlich viel weniger.

Was ich vorschlage, ist /dev/urandomanstelle von /dev/zero. Ich konnte die Ausgabe von überhaupt nicht /dev/urandomsehr stark komprimieren .

devin
quelle
Mein eingebettetes System hat es nicht /dev/zero, also /dev/urandomist es gut.
Fredrick Gauss
9
dd if=/dev/zero of=my_file.txt count=12345
Paul Tomblin
quelle
4
Denken Sie daran, dass die Standardblockgröße von dd 512 Byte beträgt. Mit diesem Befehl wird eine Datei mit einer Größe von 12345 * 512 Byte erstellt.
niemand
4

Es gibt viele Antworten, aber keine hat gut erklärt, was noch getan werden kann. Wenn Sie in Manpages nach dd suchen , können Sie die Größe einer Datei besser angeben.

Dadurch wird /tmp/zero_big_data_file.bin erstellt, das mit Nullen gefüllt ist und eine Größe von 20 Megabyte hat:

    dd if=/dev/zero of=/tmp/zero_big_data_file.bin  bs=1M count=20

Dadurch wird /tmp/zero_1000bytes_data_file.bin erstellt, das mit Nullen gefüllt ist und eine Größe von 1000 Bytes hat:

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1kB count=1

oder

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1000 count=1

  • In allen Beispielen ist bs die Blockgröße und count die Anzahl der Blöcke
  • Auf BLÖCKE und BYTES können die folgenden multiplikativen Suffixe folgen: c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 · 1000, M = 1024 · 1024, xM = M GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024 usw. für T, P, E, Z, Y.
BЈовић
quelle
3

Als Shell-Befehl:

< /dev/zero head -c 1048576 >  output
user1772090
quelle
3

Dadurch wird eine 4-MB-Textdatei mit zufälligen Zeichen im aktuellen Verzeichnis und dem Namen "4mb.txt" generiert. Sie können Parameter ändern, um verschiedene Größen und Namen zu generieren.

base64 /dev/urandom | head -c 4000000 > 4mb.txt
Berkay92
quelle
0

Verwenden fallocateSie diese Option, wenn Sie nicht auf die Festplatte warten möchten.

Beispiel:

fallocate -l 100G BigFile

Verwendung:

Usage:
 fallocate [options] <filename>

Preallocate space to, or deallocate space from a file.

Options:
 -c, --collapse-range remove a range from the file
 -d, --dig-holes      detect zeroes and replace with holes
 -i, --insert-range   insert a hole at range, shifting existing data
 -l, --length <num>   length for range operations, in bytes
 -n, --keep-size      maintain the apparent size of the file
 -o, --offset <num>   offset for range operations, in bytes
 -p, --punch-hole     replace a range with a hole (implies -n)
 -z, --zero-range     zero and ensure allocation of a range
 -x, --posix          use posix_fallocate(3) instead of fallocate(2)
 -v, --verbose        verbose mode

 -h, --help           display this help
 -V, --version        display version
qin
quelle