قم بإنشاء ملف عشوائي باستخدام البرنامج النصي shell
سؤال
كيف يمكنني إنشاء ملف عشوائي مملوء برقم أو حرف عشوائي في البرنامج النصي shell؟ أريد أيضًا تحديد حجم الملف.
المحلول
يستخدم dd
أمر لقراءة البيانات من /dev /عشوائي.
dd if=/dev/random of=random.dat bs=1000000 count=5000
هذا من شأنه أن يقرأ 5000 1 ميجابايت من كتل البيانات العشوائية ، وهو 5 جيجابت كامل من البيانات العشوائية!
تجربة الحجة الكتل للحصول على الأداء الأمثل.
نصائح أخرى
head -c 10 /dev/random > rand.txt
تغيير 10 إلى أي شيء. اقرأ "رجل عشوائي" للاختلافات بين /dev /عشوائي و /dev /urandom.
أو ، لأحرف Base64 فقط
head -c 10 /dev/random | base64 | head -c 10 > rand.txt
قد يتضمن BASE64 بعض الشخصيات التي لا تهتم بها ، ولكن لم يكن لديها وقت للتوصل إلى محول أحرف أفضل منفردة ... (نحن أيضًا نأخذ الكثير من البايتات من /dev /عشوائي. آسف ، بركة إنتروبيا!)
ستكون بداية جيدة:
http://linuxgazette.net/153/pfeiffer.html
#!/bin/bash
# Created by Ben Okopnik on Wed Jul 16 18:04:33 EDT 2008
######## User settings ############
MAXDIRS=5
MAXDEPTH=2
MAXFILES=10
MAXSIZE=1000
######## End of user settings ############
# How deep in the file system are we now?
TOP=`pwd|tr -cd '/'|wc -c`
populate() {
cd $1
curdir=$PWD
files=$(($RANDOM*$MAXFILES/32767))
for n in `seq $files`
do
f=`mktemp XXXXXX`
size=$(($RANDOM*$MAXSIZE/32767))
head -c $size /dev/urandom > $f
done
depth=`pwd|tr -cd '/'|wc -c`
if [ $(($depth-$TOP)) -ge $MAXDEPTH ]
then
return
fi
unset dirlist
dirs=$(($RANDOM*$MAXDIRS/32767))
for n in `seq $dirs`
do
d=`mktemp -d XXXXXX`
dirlist="$dirlist${dirlist:+ }$PWD/$d"
done
for dir in $dirlist
do
populate "$dir"
done
}
populate $PWD
قم بإنشاء 100 ملف تسمي بشكل عشوائي من 50 ميجابايت في الحجم لكل:
for i in `seq 1 100`; do echo $i; dd if=/dev/urandom bs=1024 count=50000 > `echo $RANDOM`; done
سيمنحك المتغير العشوائي رقمًا مختلفًا في كل مرة:
echo $RANDOM
حفظ باسم "script.sh" ، قم بتشغيل حجم ./script.sh. تم رفع رمز printf من http://mywiki.wooledge.org/bashfaq/071. بالطبع ، يمكنك تهيئة مجموعة Mychars مع قوة وحشي ، mychars = ("0" "" 1 "..." A "..." Z "" A "..." Z ") ، لكن هذا لن يحدث كن متعة ، أليس كذلك؟
#!/bin/bash
declare -a mychars
for (( I=0; I<62; I++ )); do
if [ $I -lt 10 ]; then
mychars[I]=$I
elif [ $I -lt 36 ]; then
D=$((I+55))
mychars[I]=$(printf \\$(($D/64*100+$D%64/8*10+$D%8)))
else
D=$((I+61))
mychars[I]=$(printf \\$(($D/64*100+$D%64/8*10+$D%8)))
fi
done
for (( I=$1; I>0; I-- )); do
echo -n ${mychars[$((RANDOM%62))]}
done
echo