Random 生成随机字符串zsh

Random 生成随机字符串zsh,random,zsh,Random,Zsh,我试图用以下代码生成一个随机字符串: for pic in `ls *.jpg`; do rdn=`echo $RANDOM | sha256sum | cut -d" " -f1` mv "$pic" ${rnd}.jpg done 脚本的这一部分在一个包含大量jpeg文件的目录中运行,它应该随机化它们的文件名。问题是,$RANDOM变量在迭代过程中不会更新,因此每次都会给出相同的哈希值。我尝试使用/dev/uradom,它可以工作,但比$RANDOM慢得多。每次读取$RANDOM时

我试图用以下代码生成一个随机字符串:

for pic in `ls *.jpg`; do
  rdn=`echo $RANDOM | sha256sum | cut -d" " -f1`
  mv "$pic" ${rnd}.jpg
done
脚本的这一部分在一个包含大量jpeg文件的目录中运行,它应该随机化它们的文件名。问题是,
$RANDOM
变量在迭代过程中不会更新,因此每次都会给出相同的哈希值。我尝试使用
/dev/uradom
,它可以工作,但比
$RANDOM
慢得多。每次读取$RANDOM时,如何“重新生成”
$RANDOM

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
参数。而且

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

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

mv“$pic”“$(base64您可以更简单地使用cat、tr和head来执行此操作。例如:

cat /dev/urandom | tr -dc '0-9a-zA-Z' | head -c100
此管道中的
tr
命令将删除stdin中与指定字符集不匹配的任何字符。
头将打印前100个字符,然后退出,终止整个命令

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

for file in *.jpg
    mv -n ${file} $(cat /dev/urandom | tr -dc '0-9a-zA-Z' | head -c100).jpg
在zsh中,带有一条语句的
for
循环不需要被
do
done
包围。mv的
-n
标志将防止它覆盖现有文件,以防你在我的mac电脑(使用macOS High Sierra)上遇到非常不幸的随机字符串。

,则
/dev/uradom
为我提供二进制字节,因此上述解决方案会导致
tr:invalize byte sequence
,因此我使用
base64
将字节转换为字符:

cat /dev/urandom | base64 | tr -dc '0-9a-zA-Z' | head -c100
或者我找到了一个没有base64的解决方案,这样你也可以得到标点符号:

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

适合我…如果是脚本,请确保shebang行中显示“/bin/bash”而不是“/bin/sh”“,以防万一。您使用/dev/uradom做了什么尝试?例如,如果您使用
dd
限制切片,它应该非常快。此外,bash手册中的这一行可能与此相关:如果RANDOM未设置,它将丢失其特殊属性,即使它随后被重置。我在
ls*.jpg
中为pic尝试了
;dornd=$(cat/dev/uradom|tr-dc'a-zA-Z0-9'| head-c20);mv“$pic”${rnd}.jpg;done;
您的方法应该有效。您的脚本中肯定还有一些其他错误。工作非常好。感谢在生成的随机字符串后有一行新行(更容易复制粘贴)我使用了sed:
cat/dev/uradom | base64 | tr-dc'0-9a-zA-Z'| head-c15 | sed's/$/\n/'
如果第一个管道连接到
base64
,则不需要管道连接到
tr
,因为它已经输出了ascii字节。此外,如果您想要“更容易的复制粘贴”,只需执行
cat/dev/uradom | base64 | head-c100