Filenames

隨機化 GIF JPEG 和 WEBP 文件名

  • August 10, 2022

我有一個腳本可以使用 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 腳本來隨機化每個副檔名的文件名。

我一直在擺弄這個問題的最受好評的答案,但無濟於事。

只需要另一個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 秒。

引用自:https://unix.stackexchange.com/questions/713213