Wie kann ich eine Datei mit einer bestimmten Größe über eine Befehlszeile erstellen?

125

Wie kann ich eine Datei erstellen (z. B. mit dem touchBefehl oder auf eine ähnliche Weise), aber mit einer bestimmten Größe (z. B. 14 MB)?

Der Anwendungsfall besteht darin, FTP mit verschiedenen Dateigrößen zu testen. Wenn wir eine Datei mit einer bestimmten Größe erstellen können, ist es hilfreich, die FTP-Übertragung usw. zu überprüfen.

fasil
quelle
9
Verwandte SO Frage: stackoverflow.com/questions/257844/…
Der Hochstapler

Antworten:

158

Verwendung truncate:

truncate -s 14M filename

Von man truncate:

DESCRIPTION
   Shrink or extend the size of each FILE to the specified size

[...]

 -s, --size=SIZE
          set or adjust the file size by SIZE

Hinweis: truncateMöglicherweise ist es auf Ihrem System nicht verfügbar, z. B. unter Mac OS X ist es nicht standardmäßig installiert (Sie können es jedoch problemlos installieren, z. B. mithilfe von Macports). In diesen Fällen müssen Sie möglicherweise ddoder headverwenden.

Ashutosh Vishwa Bandhu
quelle
2
Beeindruckend. Sehr schön, das wusste ich nicht.
n611x007
Mann sagt schon alles: kürzen - verkleinern oder erweitern Sie die Größe einer Datei auf die angegebene Größe
ssedano
12
Tatsächlich sehr nett. Das touchwird aber nicht benötigt, man kann es einfach ausführen truncate -s 14M filenameund schafft es filenamedirekt.
Terdon
cool ... genau danach habe ich gesucht ... danke @ oliver-salzburg
fasil
34
Dies scheint eine spärliche Datei zu erzeugen , während die folgende Antwort (die "dd" verwendet) dies nicht tut. Ich weiß nicht, ob der Unterschied für Sie wichtig ist, aber ich dachte mir, ich würde darauf hinweisen
spätestens am 1.
100

BEARBEITEN: Der einfachste Weg ist wahrscheinlich die Antworttruncate von Ashutosh Vishwa Bandhu , aber wie durch @ offby1 hervorgehoben , werden spärliche Dateien erstellt, die möglicherweise nicht Ihren Wünschen entsprechen . Die folgenden Lösungen erstellen normale, vollständige Dateien.


Die folgenden Befehle erstellen eine 14-MB-Datei mit dem Namen foo:

  1. fallocate(Danke an @Breakthrough, der es in den Kommentaren vorgeschlagen und Ahmed Masuds Antwort unten bewertet hat , in der es auch erwähnt wird.)

    fallocate -l 14000000 foo
    

    Dieser Befehl ist besonders eindrucksvoll, da er truncateunabhängig von der gewünschten Dateigröße so schnell wie (sofort) ist (im Gegensatz zu den anderen Lösungen, die für große Dateien langsam sind) und dennoch normale Dateien erstellt, keine spärlichen:

    $ truncate -s 14MB foo1.txt 
    $ fallocate -l 14000000 foo2.txt 
    $ ls -ls foo?.txt 
        0 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:54 foo1.txt
    13672 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:55 foo2.txt
    
  2. Erstellen Sie eine Datei mit zufälligen Daten

    dd if=/dev/urandom of=foo bs=14MB count=1
    

                                                                              oder

    head -c 14MB /dev/urandom > foo
    
  3. Erstellen Sie eine mit \0s gefüllte Datei :

    dd if=/dev/zero of=foo.txt bs=14MB count=1
    

                                                                              oder

    head -c 14MB /dev/zero > foo
    
  4. Erstellen Sie eine Datei mit den ersten 14 MB Daten einer anderen Datei:

    head -c 14MB bar.txt > foo
    
  5. Erstellen Sie eine Datei mit den letzten 14 MB Daten einer anderen Datei:

    tail -c 14MB bar.txt > foo
    

In all den obigen Beispielen wird die Datei sein , 14*1000*1000wenn Sie möchten 14*1024*1024, ersetzen Sie MBmit M. Zum Beispiel:

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo

fallocate Befasst sich nur mit Bytes, so dass Sie tun müssten (14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo
terdon
quelle
2
Vielen Dank ... Dies wird auch meinen Zweck erfüllen, eine Datei der gewünschten Größe zu
erstellen
2
Ich würde gegen die Verwendung von empfehlen, ddwenn es einen einfacheren, weniger potenziell destruktiven Ansatz gibt.
Akolyth
3
@acolyte würde ich auch. Deshalb gibt es für jede ddLösung eine Alternative.
Terdon
1
Der Wiki-Eintrag besagt, dass sogar dd (mit Nullen) eine Sparse-Datei erzeugt, nicht wahr? en.wikipedia.org/wiki/Sparse_file
Michael
1
@Michael Ich habe es überprüft, nur um sicherzugehen, und keiner meiner Befehle erzeugt spärliche Dateien. Der ddBefehl auf der Wiki-Seite ist völlig anders und wird nicht verwendet /dev/zero. Fragen Sie die Entwickler, ob dies logischer Moder MBlogischer ist. In den Manpages von head , tail und dd steht eindeutig "MB = 1000 * 1000, M = 1024 * 1024". Dies kann bei anderen * Nixen anders sein.
Terdon
21
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

WARNUNG dd überschreibt stillschweigend alles , worauf Sie das Recht zum Schreiben haben, wenn Sie dies freiwillig oder versehentlich angeben. Stellen Sie sicher dd, dass Sie verstehen , z. mit dem lesen dd --help, und Sie vermasseln nicht Ihre dd-befehlszeilen oder Sie können leicht irreversiblen datenverlust verursachen - sogar insgesamt .

Für den Start if=ist die Eingabedatei und of=ist die Ausgabedatei . Überprüfen Sie immer , ob Sie alles richtig gemacht haben, bevor Sie den Befehl ausführen. :)

n611x007
quelle
13

Verwenden Sie die Manpage magic dd;)

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336

verursachen 14 MB * 1024 = 14336 KB, oder:

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14

Und Sie werden 14 MB output.dat-Datei erhalten, die mit Nullen gefüllt ist: D

mirkobrankovic
quelle
8

Dies sollte der schnellste Weg sein:

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 

Andernfalls schreiben Sie einfach ein schnelles und unsauberes C- oder Perl-Programm, das die exakte Position sucht und ein einzelnes Byte schreibt. Dies ist eine Menge schneller als das eigentliche Ablegen von Daten auf die Blöcke.

Wenn Sie Dateien mit geringer Dichte dann auf Linux (und möglicherweise andere Systeme) vermeiden möchten , können Sie verwenden , fallocate -l <length>aus util-linux.

Wenn dies nicht verfügbar ist und Sie ein POSIX-kompatibles System haben, können Sie mit dem Bibliotheksaufruf posix_fallocate () ein schnelles und unsauberes Programm schreiben. posix_fallocate garantiert die Zuweisung des angegebenen Bereichs, sodass Sie bei einer späteren Verwendung des Bereichs keinen vollen Datenträger erhalten, wenn er erfolgreich zurückgegeben wird

Ahmed Masud
quelle
6

Während ddes die portable Möglichkeit ist, sind die Befehle mkfileund xfs_mkfilespeziell für diesen Zweck geschrieben und sind schneller:

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename

Der Haken ist, dass keiner der Befehle universell verfügbar ist und sich daher nicht zum Schreiben von portablen Skripten eignet. Wenn ich es jedoch interaktiv über die Befehlszeile mache, sind dies die Befehle, die ich verwende.

Standardmäßig werden mit Nullen gefüllte Dateien und keine spärlichen (oder "löchrigen") Dateien erstellt . Beide nutzen die -nOption, stattdessen Sparse-Dateien zu erstellen.

Alter Pro
quelle
1

Es gibt eine andere Option mit Perl:

perl -e 'print "a" x 1024' > file.txt

Dadurch wird eine 1-KB-Datei erstellt. Ersetzen Sie 1024 durch eine beliebige Zahl.

Majid Azimi
quelle