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