سؤال كيف أقوم بإنشاء ملف عشوائي 1GB في Linux؟


أنا أستخدم shell bash وأرغب في إخراج الأمر خارج الأمر openssl rand -base64 1000 إلى الأمر dd مثل dd if={output of openssl} of="sample.txt bs=1G count=1. أعتقد أنه يمكنني استخدام المتغيرات ولكنني غير متأكد من أفضل طريقة للقيام بذلك. السبب في رغبتي في إنشاء الملف هو أنني أريد ملف 1GB بنص عشوائي.


74
2017-09-06 18:03


الأصل




الأجوبة:


if= غير مطلوب ، يمكنك توجيه شيء ما إليه dd في حين أن:

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

لن يكون من المفيد هنا منذ ذلك الحين openssl rand يتطلب تحديد عدد وحدات البايت على أي حال. لذلك لا تحتاج في الواقع dd - هذه سوف يعمل:

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

1 غيغابايت عادة ما تكون 230 بايت (على الرغم من أنه يمكنك استخدامها 10**9 ل 109 بايت بدلا من ذلك). ال * 3/4 حسابات جزء لحساب Base64 ، مما يجعل مشفرة خرج 1 GB.

بدلا من ذلك ، يمكنك استخدامها /dev/urandom، ولكن سيكون أبطأ قليلاً من OpenSSL:

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

شخصيا ، أود أن استخدم bs=64M count=16 أو مشابه:

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

109
2017-09-06 18:17



لقد قمت بنشر سؤال بخصوص ضغط الملفات الكبيرة في superuser.com/questions/467697/... ونصحت أن استخدام /dev/urandom يولد ملف ثنائي وليس ملف نصي حقيقي. - PeanutsMonkey
PeanutsMonkey: Right؛ كنت بحاجة إلى شيء من هذا القبيل dd if=/dev/urandom bs=750M count=1 | uuencode my_sample > sample.txt. - Scott
PeanutsMonkey: لا يوجد "سيناريو عالمي حقيقي" واحد ، قد تتعامل بعض السيناريوهات مع غيغابايت من النص ، والبعض الآخر - مع غيغابايت من JPEG ، أو غيغابايت من البرامج المترجمة ... إذا كنت تريد الكثير من النص ، قم بتنزيل تفريغ ويكيبيديا فمثلا. - grawity
PeanutsMonkey: إن dd يقرأ 750،000،000 بايت من /dev/urandom وتوجيهها إلى uuencode. uuencode يشفر مدخلاته في شكل من أشكال ترميز base64 (وليس بالضرورة متناسقا مع البرامج الأخرى). بمعنى آخر ، يقوم هذا بتحويل البيانات الثنائية إلى نص. لقد استخدمت 750M لأنني أثق في بيان grawity بأن تشفير base64 يوسع البيانات بنسبة 33 ⅓٪ ، لذلك عليك أن تطلب ¾ البيانات الثنائية بقدر ما تريد في ملفك النصي. - Scott
leighmcc: لمعلوماتك: استخدام > إعادة التوجيه لا ليس جعل الكتابة تمر من خلال bash - يكافئ وجود البرنامج بفتح الملف مباشرة. - grawity


قم بإنشاء ملف محتوى عشوائي 1GB.bin:

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


19
2018-05-21 14:52



لي، iflag=fullblock كانت الإضافة الضرورية مقارنة بالإجابات الأخرى. - dojuba


جرب هذا البرنامج النصي.

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

قد يعمل هذا البرنامج النصي طالما أنك لا تمانع في استخدامه /dev/random.

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

0
2017-09-06 18:12



أنا لا أوصي بالهزال /dev/random على هذا ما لم يكن هناك سبب وجيه جدا للقيام بذلك. /dev/urandom أرخص بكثير. - Ansgar Wiechers
أيضا، $var=(command) ليس بناء صحيح في هذا السياق. - grawity
grawity - عندما تقول أنها غير صحيحة ، ماذا تقصد؟ - PeanutsMonkey
أعني ذلك بالضبط - إنه غير صحيح. - grawity
grawity،PeanutsMonkey: لقد ارتكب خطأ مطبعيًا. كان يقصد random=$(openssl rand -base64 1000). على الرغم من أنني أود أن أتساءل عما إذا كان bash يتيح لك تعيين قيمة غيغا بايت طويلة لمتغير. وحتى لو قلت random=$(openssl rand -base64 1000)، في وقت لاحق if=$random لا معنى له - Scott


إذا كنت تريد 1 غيغابايت بالضبط ، فيمكنك استخدام ما يلي:

openssl rand -out $ testfile -base64 792917038؛ truncate -s-1 $ testfile

يجعل الأمر openssl ملفًا واحدًا بالضبط كبيرًا جدًا. يقوم الأمر باقتطاع تلك البايتات.


0
2017-07-06 21:48