【问题标题】:generate a random file using shell script使用 shell 脚本生成随机文件
【发布时间】:2010-04-06 17:53:08
【问题描述】:

如何在 shell 脚本中生成一个随机数或字符填充的随机文件?我还想指定文件的大小。

【问题讨论】:

  • 输出文件中允许使用哪些字符?任何随机字节或只是 ascii 字母数字字节?

标签: shell scripting test-data


【解决方案1】:

使用dd 命令从/dev/random 读取数据。

dd if=/dev/random of=random.dat bs=1000000 count=5000

这将读取 5000 个 1MB 的随机数据块,即整整 5 GB 的随机数据!

使用块大小参数进行实验以获得最佳性能。

【讨论】:

  • dd -bs=1024 count=1 if/dev/random of=test 它不会生成我想要的正确文件大小...
  • @Tadeusz:如果他想要 MiB,而不是 MB,通常应该使用 bs=1M。
  • 在第二次阅读问题后,我认为他也只想将字符(猜测字母)和数字保存到文件中。
  • 该 dd 命令不太可能完成,因为没有 5 GB 的可用熵。如果您需要这么多“随机性”,请使用 /dev/urandom。
【解决方案2】:
head -c 10 /dev/random > rand.txt

将 10 更改为任何值。阅读“man random”了解 /dev/random 和 /dev/urandom 之间的区别。

或者,仅适用于 base64 字符

head -c 10 /dev/random | base64 | head -c 10 > rand.txt

base64 可能包含一些您不感兴趣的字符,但没有时间想出更好的单行字符转换器... (我们也从 /dev/random 中获取了太多字节。抱歉,熵池!)

【讨论】:

  • 哎呀,错过了字符和数字部分,我猜你的意思是字母数字字符...需要修改。
  • 节约熵:自我学家绿色生活的最新趋势。 :)
【解决方案3】:

一个好的开始应该是:

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

【讨论】:

    【解决方案4】:

    创建 100 个随机命名的文件,每个文件大小为 50MB:

    for i in `seq 1 100`; do echo $i; dd if=/dev/urandom bs=1024 count=50000 > `echo $RANDOM`; done
    

    【讨论】:

    • 最好使用 mktemp 创建随机文件。对于 seq 1 100 中的 i; do myfile=mktemp --tmpdir=.dd if=/dev/urandom bs=1024 count=50000 > $myfile done
    【解决方案5】:

    RANDOM 变量每次都会给你一个不同的数字:

    echo $RANDOM
    

    【讨论】:

      【解决方案6】:

      另存为“script.sh”,运行为 ./script.sh SIZE。 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
      

      【讨论】:

      • /dev/random & base64 的方法也不错,不是通过base64管道,而是通过“tr -d -c [:alnum:]”,然后你只需要计算好的字符直到你完成为止。
      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 2023-01-11
      • 2023-02-01
      相关资源
      最近更新 更多