A scopo di test devo generare un file di una certa dimensione (per testare un limite di upload).
Qual è un comando per creare un file di una certa dimensione su Linux?
A scopo di test devo generare un file di una certa dimensione (per testare un limite di upload).
Qual è un comando per creare un file di una certa dimensione su Linux?
Risposte:
dd if=/dev/zero of=upload_test bs=file_size count=1
Dov'è file_size
la dimensione del file di test in byte
dd
ha 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>
.
Per favore, il moderno è più facile e veloce. Su Linux, (scegline uno)
truncate -s 10G foo
fallocate -l 5G bar
È necessario affermare che truncate
su un file system che supporta i file sparse creerà un file sparse e fallocate
non 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, fallocate
né truncate
imposterà il contenuto del file su un valore specificato come dd
, invece il contenuto di un file allocato con fallocate
o truncate
può 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.
truncate
. Ha prodotto un file di dimensioni zero utilizzando la sintassi sopra. La "pagina man" per fallocate
dice che i file che crea sono pieni di space
dati vuoti piuttosto che di dati. Sembra che non sarebbe utile per alcuni casi previsti come "quanto tempo ci vuole per copiare un file 1G".
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!
NTFS
partizione.
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.
count=0
, bs * seek
diventa la dimensione del file
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.
truncate
e fallocate
non sono disponibili. dd
funziona anche come descritto sopra sebbene sia m
per megabyte, non M
.
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
.
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
Alcune di queste risposte ti utilizzano /dev/zero
per 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/urandom
invece di /dev/zero
. Non sono riuscito a comprimere affatto l'output /dev/urandom
.
/dev/zero
, quindi /dev/urandom
è buono.
dd if=/dev/zero of=my_file.txt count=12345
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
Come comando shell:
< /dev/zero head -c 1048576 > output
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