Làm cách nào để tạo tệp ngẫu nhiên 1GB trong Linux?


88

Tôi đang sử dụng bash shell và muốn chuyển lệnh openssl rand -base64 1000ra khỏi lệnh ddnhư lệnh dd if={output of openssl} of="sample.txt bs=1G count=1. Tôi nghĩ rằng tôi có thể sử dụng các biến nhưng tôi không chắc làm thế nào tốt nhất để làm như vậy. Lý do tôi muốn tạo tệp là vì tôi muốn tệp 1GB có văn bản ngẫu nhiên.

Câu trả lời:


130

if=không bắt buộc, ddthay vào đó bạn có thể chuyển một cái gì đó vào :

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

Ở đây sẽ không hữu ích vì openssl randyêu cầu chỉ định số lượng byte. Vì vậy, bạn không thực sự cần dd- điều này sẽ làm việc:

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

1 gigabyte thường là 2 30 byte (mặc dù bạn có thể sử dụng 10**9cho 10 9 byte thay thế). Phần * 3/4chiếm tài khoản Base64, làm cho đầu ra được mã hóa 1 GB.

Ngoài ra, bạn có thể sử dụng /dev/urandom, nhưng nó sẽ chậm hơn một chút so với OpenSSL:

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

Cá nhân, tôi sẽ sử dụng bs=64M count=16hoặc tương tự:

dd if=/dev/urandom of=sample.txt bs=64M count=16

2
Tôi đã đăng một câu hỏi liên quan đến việc nén các tệp lớn tại superuser.com/questions/467697/ , và được khuyên rằng sử dụng /dev/urandomtạo tệp nhị phân chứ không phải tệp văn bản thực.
PeanutsMonkey

2
@PeanutsMonkey: Phải; bạn sẽ cần một cái gì đó như dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt.
Scott

3
@PeanutsMonkey: Không có "kịch bản thế giới thực" duy nhất, một số kịch bản có thể đối phó với gigabyte của văn bản, những người khác - với gigabyte JPEG, hoặc gigabyte phần mềm biên soạn ... Nếu bạn muốn có một rất nhiều văn bản, tải về một Wikipedia đổ cho thí dụ.
grawity

2
@PeanutsMonkey: ddĐọc 750.000.000 byte từ /dev/urandomvà đưa chúng vào uuencode. uuencodemã hóa đầu vào của nó thành một dạng mã hóa base64 (không nhất thiết phải phù hợp với các chương trình khác). Nói cách khác, điều này chuyển đổi dữ liệu nhị phân thành văn bản. Tôi đã sử dụng 750M vì tôi tin tưởng tuyên bố của grawity rằng mã hóa base64 mở rộng dữ liệu lên 33%, vì vậy bạn cần yêu cầu số lượng dữ liệu nhị phân như bạn muốn trong tệp văn bản của mình.
Scott

3
Lưu ý nếu nó nói rằng dd: warning: partial read (33554431 bytes); suggest iflag=fullblocknó sẽ tạo một tệp bị cắt bớt để thêm iflag=fullblockcờ, sau đó nó hoạt động.
rogerdpack

25

Tạo tệp nội dung ngẫu nhiên 1GB.bin:

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


3
Đối với tôi, iflag=fullblocklà sự bổ sung cần thiết so với các câu trả lời khác.
dojuba

2

Nếu bạn muốn CHÍNH XÁC 1GB, thì bạn có thể sử dụng như sau:

openssl rand -out $ testfile -base64 792917038; cắt ngắn -s-1 $ testfile

Lệnh openssl làm cho một tệp chính xác là 1 byte quá lớn. Lệnh cắt ngắn cắt bỏ byte đó.


Mà thêm byte có lẽ là do -base64. Loại bỏ nó sẽ dẫn đến một tập tin với kích thước chính xác.
Daniel

-1

Hãy thử kịch bản này.

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

Kịch bản này có thể hoạt động miễn là bạn không phiền khi sử dụng /dev/random.

#!/bin/bash
dd if=/dev/random of="sample.txt bs=1G count=1"

8
Tôi sẽ không khuyên bạn nên lãng phí /dev/randomđiều này trừ khi có một lý do rất chính đáng để làm điều đó. /dev/urandomrẻ hơn nhiều
Ansgar Wiechers

1
Ngoài ra, $var=(command)không phải là cú pháp hợp lệ trong bối cảnh này.
grawity

@grawity - Khi bạn nói nó không hợp lệ, bạn có ý gì?
PeanutsMonkey

Ý tôi là chính xác - không chính xác.
grawity

3
@grawity, @PeanutsMonkey: Anh ấy mắc lỗi đánh máy; ông muốn nói random=$(openssl rand -base64 1000). Mặc dù tôi sẽ hỏi liệu bashcó cho phép bạn gán giá trị dài gigabyte cho một biến không. Và ngay cả khi bạn nói random=$(openssl rand -base64 1000), điều tiếp theo if=$randomkhông có ý nghĩa.
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.