随机化 GIF JPEG 和 WEBP 文件名

随机化 GIF JPEG 和 WEBP 文件名

我有一个脚本,可以随机化带有 JPEG 扩展名的文件名:

#!/bin/bash for img in *.jpg; do newname=$(head /dev/urandom | tr -dc a-z0-9 | head -c 8) mv "$img" "$newname".jpg; done

该脚本与 JPEG 文件一起使用时,会输出如下所示的文件名:

0cb1v984.jpg dqm2xxoj.jpg o61bg4n5.jpg

但是,当我尝试用“.gif”或“.webp”替换此 bash 脚本中的“.jpg”扩展名时,它不起作用。

问题是否是由于我尝试将 GIF 和 WEBP 重命名为动画 GIF 和 WEBP 造成的?

理想情况下,我希望有一个 bash 脚本可以随机化具有这 3 个扩展名中任意一个的文件的文件名,但我也可以使用 3 个不同的 bash 脚本来随机化每个扩展名的文件名。

我已经摆弄了最受好评的答案提问,无果。

答案1

只需要另一个for循环来循环扩展即可。

for ext in jpg gif webp; do
  for img in *.${ext}; do
    newname="$(head /dev/urandom | tr -dc a-z0-9 | head -c 8).${ext}"
    mv "$img" "$newname"
  done
done

但您的方法存在一些问题。

  • 规模化效率低下——最好批量生成随机数据并一次截取 8 个字符
  • 名称冲突的可能性(不太可能但并非不可能)
  • 可能/dev/urandom不会在前十“行”中提供 8 个字母数字(也不太可能,但也并非不可能)

所以这是一个改进版本

# give our variables global scope
declare data=''
declare newname

rand() {
  # check if data contains the required # of characters...
  if [ -z "${data:${1}}" ] ; then
    # ...if not, generate 1000 more characters
    data="${data}$(tr -dc a-z0-9 < /dev/urandom | head -c 1000)"
  fi
  # fill the nominated variable with the required number of characters
  eval "${2}"="${data:0:${1}}"
  # remove the characters just used from the random data
  data="${data:${1}}"
}

for ext in jpg gif webp; do
  for img in *.${ext}; do
    while true ; do
      rand 8 newname
      # keep getting $newname values until $newname.$ext doesn't exist
      [ -e "${newname}.${ext}" ] || break
    done
    mv "${img}" "${newname}.${ext}"
  done
done

在我的机器上,这个版本大约需要 11 秒才能处理 1500 个文件,而效率较低的版本大约需要 25 秒。

相关内容