我正在尝试使用以下代码生成随机字符串:
for pic in `ls *.jpg`; do
rdn=`echo $RANDOM | sha256sum | cut -d" " -f1`
mv "$pic" ${rnd}.jpg
done
这部分脚本在包含大量jpeg文件的目录中运行,它应该随机化它们的文件名。问题是$RANDOM
变量在迭代期间不会更新,因此每次都会提供相同的哈希值。我尝试使用/dev/urandom
,但它有效,但比$RANDOM
要慢很多。每次阅读时,我可以做什么来“重新生成”$RANDOM
?
答案 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
循环不需要被do
或done
包围。 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}}