Come creare un file con una determinata dimensione in Linux?


Risposte:


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

Dov'è file_sizela dimensione del file di test in byte


Oh, potrebbe essere più efficiente del mio approccio perché fa tutto in un blocco. Buona idea.
Paul Tomblin,

10
In realtà, l'uso di un enorme formato di blocco funzionerà molto peggio una volta che diventa molto grande, poiché allocerà e leggerà quella quantità in memoria prima di scrivere. Se questo è qualcosa come bs = 4GiB probabilmente finirai per scambiare.
Brian,

35
ddha un limite di 2 ^ 32 per i suoi valori, in modo da creare un file di dimensioni superiori a 4 GB, c'è un trucco: dd if=/dev/zero of=test bs=1M count=<size in megabytes>.
Dmytro Sirenko,

2
Vedi la prossima risposta per un approccio migliore e più veloce
dadi eleganti il

2
@elegantdice non è chiaro quale sia la risposta successiva, possono cambiare posizione
vladkras

160

Per favore, il moderno è più facile e veloce. Su Linux, (scegline uno)

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

È necessario affermare che truncatesu un file system che supporta i file sparse creerà un file sparse e fallocatenon lo farà. Un file sparse è quello in cui le unità di allocazione che compongono il file non vengono effettivamente allocate fino a quando non vengono utilizzate. I metadati per il file occuperanno comunque uno spazio considerevole, ma probabilmente non si avvicinano alla dimensione effettiva del file. Si consiglia di consultare le risorse sui file sparsi per ulteriori informazioni in quanto vi sono vantaggi e svantaggi per questo tipo di file. Un file non sparse ha i suoi blocchi (unità di allocazione) allocati in anticipo, il che significa che lo spazio è riservato per quanto lo vede il file system. Inoltre, fallocatetruncateimposterà il contenuto del file su un valore specificato come dd, invece il contenuto di un file allocato con fallocateo truncatepuò essere qualsiasi valore di cestino che esisteva nelle unità allocate durante la creazione e questo comportamento può o non può essere desiderato. Il ddè il più lento perché in realtà scrive il valore o il blocco di dati per l'intero flusso di file come specificato con la sua linea di comando.

Questo comportamento potrebbe essere potenzialmente diverso - a seconda del file system utilizzato e della conformità di quel file system a qualsiasi standard o specifica. Pertanto si consiglia di effettuare ricerche adeguate per garantire che venga utilizzato il metodo appropriato.


Ci ho provato truncate. Ha prodotto un file di dimensioni zero utilizzando la sintassi sopra. La "pagina man" per fallocatedice che i file che crea sono pieni di spacedati vuoti piuttosto che di dati. Sembra che non sarebbe utile per alcuni casi previsti come "quanto tempo ci vuole per copiare un file 1G".
Mark Stosberg,

6
fallocate sembra funzionare bene per me. Crea un file delle dimensioni giuste.
Aater Suleman,

5
Questa è la migliore risposta a questa domanda. Il troncamento / fallocate non richiede molto tempo, perché non scrive tutti i blocchi del file. Ma, se dovessi quindi caricare il file risultante da qualche parte, leggerebbe zero per l'intera cosa.
Mike Andrews,

4
Se si desidera eseguire questo sotto OSX, quindi avrete bisogno di fare questo: brew install coreutils. Questo aggiungerà un g di fronte al comando, in modo da avere per eseguirlo in questo modo: gtruncate -s 10G foo. Spero che questo ti aiuti!
DerekE,

Sembra che non funzioni su una NTFSpartizione.
eloyesp,

40

Solo per seguire il post di Tom , puoi usare dd anche per creare file sparsi:

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

Ciò creerà un file con un "buco" al suo interno sulla maggior parte degli unix: i dati non verranno effettivamente scritti su disco o occuperanno spazio fino a quando non viene scritto qualcosa di diverso da zero.


L'impostazione count = 0 evita di dover sottrarre un byte dalla dimensione del file.
Andrewdotn,

3
con count=0, bs * seekdiventa la dimensione del file
Jayen

24

Su OSX (e Solaris, a quanto pare), mkfileè disponibile anche il comando:

mkfile 10g big_file

Questo crea un file da 10 GB chiamato "big_file". Ho trovato questo approccio qui.


Ciò è utile per situazioni come OS X in cui i comandi truncatee fallocatenon sono disponibili. ddfunziona anche come descritto sopra sebbene sia mper megabyte, non M.
user535673,

Sbagliato: questo crea un file da 10 GiB (= ~ 10,7 GB).
dessert

20

Usa questo comando:

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

Per creare un file grande (vuoto), impostare $INPUT-FILE=/dev/zero.
La dimensione totale del file sarà $BLOCK-SIZE * $NUM-BLOCKS.
Il nuovo file creato sarà $OUTPUT-FILE.


Perché hai posto la domanda?
Henry B,

9
Ho dovuto chiedere a Google la risposta, quindi l'ho messa qui, in modo che potesse essere discussa e aggiornata ... sai, il punto dell'intero sito?
Grundlefleck,

2
So che la gente sta votando @Grundlefleck per prostitute XP, ma ha un punto: uno dei modi per utilizzare questo sito come immaginato da Jeff e Joel è quello di porre una domanda e una risposta per qualcosa che hai appena scoperto.
Paul Tomblin,

3
Grazie Paolo Anche se non sono così infastidito dai punti, sono infastidito da cose che trovo su Google che potrebbero essere imperfette in un modo che non avrei mai scoperto se non le avessi chiesto qui. Le persone dovrebbero sentirsi libere di rendere la mia comunità di Q / A di proprietà se pensano che io sia puttana, scrollando le spalle .
Grundlefleck,

2
Per citare le domande frequenti "Va anche bene porre e rispondere alla tua domanda di programmazione, ma fai finta di essere su Jeopardy: esprimilo sotto forma di una domanda".
Craig Angus,

17

Puoi farlo a livello di codice:

#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;
}

Questo approccio è particolarmente utile per successivamente mmap il file in memoria.

utilizzare il comando seguente per verificare che il file abbia le dimensioni corrette:

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

Stai attento:

# du /tmp/foo.txt

probabilmente stamperà 0 perché è allocato come file Sparse se supportato dal tuo filesystem.

vedi anche: man 2 aperto e man 2 troncato


10

potresti fare:

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

Dove si sostituisce 100 con il numero di byte che si desidera scrivere.


E anche il byte di riempimento effettivo. Ho bisogno di "\ xff" e funziona benissimo. Grazie! :)
Ray,

10

Alcune di queste risposte ti utilizzano /dev/zeroper l'origine dei tuoi dati. Se la velocità di upload della rete di test potrebbe non essere la migliore idea se l'applicazione sta eseguendo una compressione, un file pieno di zeri viene compresso molto bene. Utilizzando questo comando per generare il file

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

Potrei comprimere upload_test fino a circa 200 byte. Quindi potresti metterti in una situazione in cui pensi che stai caricando un file da 10 KB, ma in realtà sarebbe molto meno.

Quello che suggerisco è usare /dev/urandominvece di /dev/zero. Non sono riuscito a comprimere affatto l'output /dev/urandom.


Il mio sistema incorporato non ha /dev/zero, quindi /dev/urandomè buono.
Fredrick Gauss,

9
dd if=/dev/zero of=my_file.txt count=12345

4
Ricorda che la dimensione del blocco predefinita di dd è 512 byte, quindi questo comando renderà un file 12345 * 512 byte.
nessuno

4

Ci sono molte risposte, ma nessuna ha spiegato bene cos'altro si può fare. Esaminando le pagine man per dd , è possibile specificare meglio le dimensioni di un file.

Questo creerà /tmp/zero_big_data_file.bin pieno di zeri, che ha una dimensione di 20 megabyte:

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

Questo creerà /tmp/zero_1000bytes_data_file.bin pieno di zeri, che ha una dimensione di 1000 byte:

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

o

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

  • In tutti gli esempi, bs è la dimensione del blocco e count è il numero di blocchi
  • BLOCCHI e BYTES possono essere seguiti dai seguenti suffissi moltiplicativi: 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 e così via per T, P, E, Z, Y.


3

Ciò genererà un file di testo di 4 MB con caratteri casuali nella directory corrente e il suo nome "4mb.txt" È possibile modificare i parametri per generare dimensioni e nomi diversi.

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

0

Uso fallocate se non si desidera attendere il disco.

Esempio:

fallocate -l 100G BigFile

Uso:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.