生成随机字符串zsh

时间:2013-10-24 03:43:41

标签: random zsh

我正在尝试使用以下代码生成随机字符串:

for pic in `ls *.jpg`; do
  rdn=`echo $RANDOM | sha256sum | cut -d" " -f1`
  mv "$pic" ${rnd}.jpg
done

这部分脚本在包含大量jpeg文件的目录中运行,它应该随机化它们的文件名。问题是$RANDOM变量在迭代期间不会更新,因此每次都会提供相同的哈希值。我尝试使用/dev/urandom,但它有效,但比$RANDOM要慢很多。每次阅读时,我可以做什么来“重新生成”$RANDOM

3 个答案:

答案 0 :(得分:4)

你可以更简单地使用cat,tr和head来做到这一点。例如:

cat /dev/urandom | tr -dc '0-9a-zA-Z' | head -c100

此管道中的tr命令将删除stdin中任何匹配指定字符集的字符。 head将打印前100个字符,然后退出,终止整个命令。

这将生成一个包含字母数字字符的100个字符的字符串。要将其转换为重命名,您只需使用命令替换:

for file in *.jpg
    mv -n ${file} $(cat /dev/urandom | tr -dc '0-9a-zA-Z' | head -c100).jpg

在zsh中,带有单个语句的for循环不需要被dodone包围。 mv的-n标志将阻止它覆盖现有文件 - 以防万一你真的不熟悉随机字符串。

答案 1 :(得分:1)

for pic in *.jpg; do # Iterate over the jpgs in the current directory.
  dd if=/dev/urandom count=1 2>/dev/null | sha256sum | ( # Gather 512 bytes from /dev/urandom
    read rnd _ # Read the first "word" in the sha256sum output
    mv "$pic" ${rnd}.jpg # rename the jpg.
  )
done

管道到read会导致隐式子shell,因此我创建了一个显式子shell,以保证我仍然可以访问rnd参数。另外,don't parse ls

顺便问一下,你确定你不只是想base64输出吗?到目前为止它比sha256sum便宜,我看不出你从sha256sum中得到什么。此外,它使代码更容易阅读:

for pic in *.jpg; do
  mv "$pic" "$(base64 </dev/urandom | tr -dc 'a-zA-Z0-9' | head -c20).jpg"
done

答案 2 :(得分:1)

在我的Mac上(使用macOS High Sierra),tr: Illegal byte sequence给出了二进制字节,因此上面的解决方案产生base64,所以我使用cat /dev/urandom | base64 | tr -dc '0-9a-zA-Z' | head -c100 将字节转换为字符:

cat /dev/urandom | LC_ALL=C tr -dc '\''[:alnum:]\!\@\#$\-\.\,'\'' | head -c40

或者我找到了没有base64的解决方案,所以你也可以得到标点符号:

{{1}}