我正在尝试为 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"