ファイルの末尾に英数字拡張子を追加する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"