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
ただし、このbashスクリプトの拡張子「.jpg」を「.gif」または「.webp」に置き換えようとすると機能しません。
GIFとWEBPの名前をアニメーションGIFとWEBPに変更しようとして問題が発生しましたか?
理想的には、これら3つの拡張子を持つファイルのファイル名をランダムに指定するbashスクリプトを使用したいのですが、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
最初の10の「行」に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
私のコンピュータでは、このバージョンは1500ファイルを処理するのに約11秒かかりますが、効率が悪いバージョンは約25秒かかります。