Jak utworzyć losowy plik 1 GB w systemie Linux?

88

Korzystam z powłoki bash i chciałbym wyprowadzić z polecenia openssl rand -base64 1000polecenie ddtakie jak dd if={output of openssl} of="sample.txt bs=1G count=1. Myślę, że mogę używać zmiennych, ale nie jestem pewien, jak najlepiej to zrobić. Powodem, dla którego chciałbym utworzyć plik, jest to, że chciałbym mieć plik 1 GB z losowym tekstem.

PeanutsMonkey
źródło

Odpowiedzi:

130

if=nie jest wymagane, ddzamiast tego możesz wpakować coś :

something... | dd of=sample.txt bs=1G count=1

Nie byłoby to tutaj przydatne, ponieważ i tak openssl randwymaga podania liczby bajtów. Więc tak naprawdę nie potrzebujesz dd- to zadziała:

openssl rand -out sample.txt -base64 $(( 2**30 * 3/4 ))

1 gigabajt to zwykle 2 30 bajtów (choć zamiast tego można użyć 10**910 9 bajtów). * 3/4Stanowi część do Base64 napowietrznych, dzięki czemu kodowany wyjściowego 1 GB.

Alternatywnie możesz użyć /dev/urandom, ale byłoby to trochę wolniejsze niż OpenSSL:

dd if=/dev/urandom of=sample.txt bs=1G count=1

Osobiście użyłbym bs=64M count=16lub podobnego:

dd if=/dev/urandom of=sample.txt bs=64M count=16
grawitacja
źródło
2
Wysłałem pytanie dotyczące kompresji dużych plików na superuser.com/questions/467697/... i doradzono mi, że użycie /dev/urandomgeneruje plik binarny, a nie prawdziwy plik tekstowy.
PeanutsMonkey,
2
@PeanutsMonkey: Right; potrzebujesz czegoś takiego dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt.
Scott
3
@PeanutsMonkey: Nie ma jednego „scenariusza świata rzeczywistego”, niektóre scenariusze mogą dotyczyć gigabajtów tekstu, inne - gigabajtów plików JPEG lub gigabajtów skompilowanego oprogramowania ... Jeśli chcesz dużo tekstu, pobierz zrzut Wikipedii dla przykład.
grawity
2
@PeanutsMonkey: ddodczytuje 750 000 000 bajtów /dev/urandomi wpuszcza je uuencode. uuencodekoduje dane wejściowe do postaci kodowania base64 (niekoniecznie spójne z innymi programami). Innymi słowy, konwertuje to dane binarne na tekst. Użyłem 750M, ponieważ zaufałem stwierdzeniu grawity, że kodowanie base64 rozszerza dane o 33⅓%, więc musisz poprosić o ¾ tyle danych binarnych, ile chcesz w pliku tekstowym.
Scott,
3
Uwaga: jeśli powie, dd: warning: partial read (33554431 bytes); suggest iflag=fullblockże utworzy plik obcięty, więc dodaj iflag=fullblockflagę, to działa.
rogerdpack
25

Utwórz losowy plik zawartości 1GB.bin:

dd if = / dev / urandom of = 1GB.bin bs = 64M count = 16 iflag = fullblock

anneb
źródło
3
Dla mnie iflag=fullblockbyło to konieczne uzupełnienie w porównaniu z innymi odpowiedziami.
dojuba
2

Jeśli chcesz DOKŁADNIE 1 GB, możesz użyć następujących opcji:

openssl rand -out $ plik-testowy -base64 792917038; truncate -s-1 $ plik testowy

Komenda openssl powoduje, że plik ma dokładnie 1 bajt za duży. Polecenie obcięcia powoduje przycięcie tego bajtu.

Joel Jacobs
źródło
Ten dodatkowy bajt jest prawdopodobnie spowodowany przez -base64. Usunięcie go spowoduje utworzenie pliku o odpowiednim rozmiarze.
Daniel
-1

Wypróbuj ten skrypt.

#!/bin/bash
openssl rand -base64 1000 | dd of=sample.txt bs=1G count=1

Ten skrypt może działać, o ile nie masz nic przeciwko użyciu /dev/random.

#!/bin/bash
dd if=/dev/random of="sample.txt bs=1G count=1"
Jonathan Reno
źródło
8
Nie zalecałbym marnowania /dev/randomna to pieniędzy, chyba że istnieje ku temu dobry powód. /dev/urandomjest znacznie tańszy.
Ansgar Wiechers,
1
Ponadto $var=(command)nie jest poprawna składnia w tym kontekście.
grawity
@grawity - co mówisz, gdy mówisz, że to nieprawda?
PeanutsMonkey,
Mam na myśli dokładnie to - to jest nieprawidłowe.
grawity
3
@grawity, @PeanutsMonkey: Napisał literówkę; miał na myśli random=$(openssl rand -base64 1000). Chociaż chciałbym zapytać, czy bashpozwoliłbyś przypisać do zmiennej wartość o długości gigabajtów. I nawet jeśli tak mówisz random=$(openssl rand -base64 1000), kolejne if=$randomnie mają sensu.
Scott