Bashスクリプトはファイル名に任意の拡張子を提供します。

Bashスクリプトはファイル名に任意の拡張子を提供します。

ファイルの末尾に英数字拡張子を追加するOSX用のbashスクリプトを作成しようとしています。

ランダムな6文字を生成する方法が見つかりません。前のファイル名_cod_45fg43.zip

スクリプトは次のとおりです。

for fname in *.zip
do
 CODE= ???
 CODESTRING="_cod_$CODE"
 mv "$fname" "${fname%.zip}$CODESTRING.zip"
done

答え1

あなたが使用できるmktemp

$ mktemp foobarXXXXXX
foobarAU7TyS
$ mktemp foobarXXXXXX
foobardDqS61
$ mktemp foobarXXXXXX
foobarioCZw2

あなたの例では、次のようになります。

mv "$fname" "$(mktemp "${fname%.zip}"XXXXXX.zip)"

しかし、いくつかのテストをしなければなりません。 "X"で終わるzipファイルでは奇妙なことが起こります...;)

利点は、mktemp可能性に関係なく、ファイル名がすでに存在しないことを保証することです。もちろん、上記の例では、もともとエラーをチェックしないと役に立ちません。

または。mv--backup

(最初にこれを行う理由によって異なります。)

答え2

これは働きます:

   for fname in *.zip
    do
        CODE="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
        CODESTRING="_cod_${CODE}"
        YOUR mv CODE
    done

答え3

私たちは既存のファイルに入ることを避けるために多くの努力を払いましたmv-ing

orig_umask=`umask`
umask 077; # take away perms from others + group
orig_state=$(set +o | awk '$3 == "noclobber"')
set -C; # cannot overwrite now
for fname in ./*.zip
do
   while :
   do
      CODE=$(head /dev/urandom | tr -cd 'a-zA-Z0-9_' | dd bs=1 count=6 2>/dev/null)
      CODESTRING="code_${CODE}"
      new_name=${fname%".zip"}_${CODESTRING}.zip
      { > $new_name; } &>/dev/null && break
   done
   mv -f "$fname" "$new_name"
done
# recover state
eval "$orig_state"
umask "$orig_umask"

関連情報