Filenames
隨機化 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 腳本來隨機化每個副檔名的文件名。
我一直在擺弄這個問題的最受好評的答案,但無濟於事。
只需要另一個
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 秒。