Isso funcionará:
for fname in *.zip
do
CODE="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
CODESTRING="_cod_${CODE}"
YOUR mv CODE
done
Eu estou tentando fazer um script bash para o OSX que adiciona uma extensão alfanumérica no final do arquivo.
Não consigo encontrar como fazer o caractere aleatório de 6 caracteres. Ex filename_cod_45fg43.zip
Aqui o script:
for fname in *.zip
do
CODE= ???
CODESTRING="_cod_$CODE"
mv "$fname" "${fname%.zip}$CODESTRING.zip"
done
Obrigado em avançado pelo suporte!
Você pode usar mktemp
:
$ mktemp foobarXXXXXX
foobarAU7TyS
$ mktemp foobarXXXXXX
foobardDqS61
$ mktemp foobarXXXXXX
foobarioCZw2
No seu exemplo, talvez seja algo como:
mv "$fname" "$(mktemp "${fname%.zip}"XXXXXX.zip)"
Mas você deve fazer alguns testes. Coisas estranhas acontecem para arquivos zip que terminam com 'X' ...;) (precisa de um sufixo / separador não-X que eu convenientemente deixei de fora neste exemplo).
O interessante sobre mktemp
é que, independentemente de quão improvável seja a chance, o nome do arquivo já não existe. Claro que é inútil no exemplo acima que não verifica erros em primeiro lugar ...
Ou você faz uso do mecanismo mv
de --backup
.
(Depende de por que você está fazendo isso em primeiro lugar.)
Nós vamos a todos esses comprimentos para evitar mv-ing
em um arquivo existente e também poder fazer uma criação à prova de falhas de um novo nome de arquivo que realmente não existia antes e ser capaz de possuí-lo.
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"
Tags bash rename shell-script random