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 文件会发生奇怪的事情...;)(需要一个非 X 后缀/分隔符,我在本例中方便地省略了它)。

好处是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"

相关内容