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.

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

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


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.


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"

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.