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

ただし、この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秒かかります。

関連情報