Come creare un file di grandi dimensioni in UNIX?


17

Ho trovato un modo in Windows per fare una cosa del genere

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/

Esiste un modo in UNIX per copiare un file, aggiungere e quindi ripetere il processo? Qualcosa del genere for .. cat file1.txt > file1.txt?


Perché copiare il file e aggiungere invece di aggiungere semplicemente?
123

@ 123 append è buono, ma come fare il loop?
Thomas Lee,

4
for i in {1..1000000};do echo "string" >> file;donein bash.
123

9
Deve essere un file di testo? Puoi creare file di qualsiasi dimensione da / dev / zero o / dev / urandom.
RealSkeptic,

2
Mi aspetto type file >> filedi funzionare in un ciclo infinito (almeno non appena è sufficientemente grande da non rientrare in un buffer).
Stéphane Chazelas,

Risposte:


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

Con csh/ tcsh:

repeat 10000 echo some test > large-file

Con zsh:

{repeat 10000 echo some test} > large-file

Sui sistemi GNU, vedere anche:

seq 100000 > large-file

O:

truncate -s 10T large-file

(crea un file sparse di 10 TB (molto grande ma non occupa spazio sul disco)) e le altre alternative discusse in "Creare un file di test con molti zero byte" .


Fare cat file >> filesarebbe una cattiva idea.

Innanzitutto, non funziona con alcune catimplementazioni che rifiutano di leggere file uguali al loro file di output. Ma anche se lo aggiri facendo cat file | cat >> file, se fileè più grande catdel buffer interno, ciò causerebbe catl'esecuzione in un ciclo infinito in quanto finirebbe per leggere i dati che ha scritto in precedenza.

Sui file system supportati da un disco rigido rotazionale, sarebbe anche piuttosto inefficiente (dopo aver raggiunto una dimensione maggiore di quella che potrebbe essere memorizzata nella cache) poiché l'unità dovrebbe andare avanti e indietro tra la posizione in cui leggere i dati, e quello dove scriverlo.


19
O dd if=/dev/zero of=large-file bs=1024 count=1024per un file da 1 MB
doneal24

7
@ DougO'Neal Trovo dd if=/dev/zero of=test bs=1M count=1che sia più chiaro.
123


1
Oppure usa / dev / urandom invece di / dev / zero se vuoi dati casuali.
user253751

3
@ robertotomás sì, tutti lo usano dd, ma non ho mai capito il perché. In effetti, penso di averlo mai usato solo per leggere un MBR o attività marginali simili. Nella mia esperienza, altri strumenti sono più veloci, più semplici e più sicuri per la stragrande maggioranza dei casi in cui le persone usano dd. Penso che questo sia uno di quei casi in cui comune! = Ottimo, come sudo suo cat file | grep foo.
terdon

22

È possibile creare un file di grandi dimensioni su Solaris usando:

mkfile 10g /path/to/file

Un altro modo che funziona su Solaris (e Linux):

truncate -s 10g /path/to file

È anche possibile utilizzare:

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240

dd one is like a terabyte
123

1
Definire "un file di grandi dimensioni" :-) Ma ho modificato dal momento che gli altri campioni dichiarano tutti 10g ...
Lambert

troncare Impossibile eseguire "troncare". Nessun file o directory di questo tipo sembra essere solo Linux.
schily

truncateesiste su Solaris 11.2+
Lambert

11

Il modo più veloce possibile per creare un file di grandi dimensioni in un sistema Linux è fallocate:

sudo fallocate -l 2G bigfile

fallocate manipola il file system e non scrive effettivamente nei settori di dati per impostazione predefinita, e come tale estremamente veloce. Il rovescio della medaglia è che deve essere eseguito come root.

Eseguendolo in successione in un ciclo, puoi riempire il più grande dei filesystem in pochi secondi.

A partire dal man fallocate

fallocate viene utilizzato per manipolare lo spazio su disco allocato per un file, sia per deallocare che per preallocarlo.
Per i filesystem che supportano la chiamata di sistema fallocate, la preallocazione viene eseguita rapidamente allocando i blocchi e contrassegnandoli come non inizializzati, senza richiedere IO sui blocchi di dati. Questo è molto più veloce della creazione di un file riempendolo con zeri.
Supportato per XFS (dal Linux 2.6.38), ext4 (dal Linux 3.0), Btrfs (dal Linux 3.7) e tmpfs (dal Linux 3.5).


1
Questa dovrebbe essere la risposta accettata. Facile e veloce.
Ardochhigh,

8

Questo continuerà fino a quando CTRL-C:

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

Fai attenzione, perché puoi ottenere centinaia di migliaia di linee / secondo ...

Da man yes:

yes - output a string repeatedly until killed

Questo è un metodo molto semplice per creare un file di grandi dimensioni in ambiente Linux.
Chaminda Bandara,

1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txtti permetterebbe di ottenere un importo preciso. (-n $ TARGET_NUMBER_OF_LINES). yesmorirebbe automaticamente a causa di un "tubo rotto" quando headtermina perché il numero di destinazione è stato raggiunto.
PypeBros,

4

Se ti capisco correttamente, stai cercando qualcosa come:

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

Ciò creerà un file con 22 ripetizioni di "test line". Se si desidera una dimensione file specifica, è possibile utilizzare qualcosa del genere (su Linux). 1024 è un kilobyte:

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

Personalmente, quando voglio creare un file di grandi dimensioni, utilizzo due file e cat l'uno nell'altro. Puoi ripetere il processo fino a raggiungere la dimensione desiderata (1 MB qui):

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

Nota che questa soluzione spesso supererà la dimensione desiderata perché se il file è al di sotto del limite, tutto verrà catturato di nuovo.

Infine, se tutto ciò che vuoi è un file della dimensione desiderata e non ne hai bisogno per contenere effettivamente qualcosa, puoi usare truncate:

truncate -s 1M file

1
Il catfile in realtà ha qualche vantaggio in più solo per l'aggiunta? Sembrerebbe che ci vorrebbe più tempo in quanto deve eseguire il fork di due processi ogni ciclo e anche spostare l'intero contenuto più volte.
123

1
@ 123 velocità. L' catapproccio è molto, molto più veloce. Ha senso solo per la creazione di file di grandi dimensioni, ma quello ha creato un file 545M in 10 secondi sul mio computer. Lo stesso whileloop ha echo "test line" >> filecreato un file 96K nello stesso lasso di tempo.
terdon

Immagino che la cosa con l'approccio "gatto" sia che cresce esponenzialmente. All'avvio della seconda iterazione, "newfile" ha già 1 riga e "file" ne ha 2, e al termine "newfile" ora è 3 righe e "file" è 5. Successivamente, "newfile" sarà 8 e " file 'sarà 13. Avanti (21, 34), ecc.
PypeBros,

aspetto negativo: potrebbe essere necessario più spazio su disco (> = 1,5 * dimensioni_ desiderate) rispetto alle dimensioni del file di destinazione durante la creazione del file.
PypeBros,

btw. Se ne hai truncate, puoi truncate -s 1Gcreare il file al primo posto. unix.stackexchange.com/a/269184/85549 . Potresti sostituirlo con un head -c $DESIRED_SIZE, possibilmente all'interno del whileciclo.
PypeBros,

3

Convogliando i contenuti di /dev/urandomper headè possibile reindirizzare l'output in un file, in modo da:

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

Ti darà un file con 100 byte di immondizia.


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

stesso effetto del tuo script di Windows ma in bash, non puoi concatenare un file a se stesso, direttamente.


Oltre a dimenticare l' .txtestensione, alla fine lascerai 2 file di grandi dimensioni.
ott--
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.