我有一个脚本,可以随机化带有 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 秒。