Script Bash para dar extensão aleatória ao nome do arquivo

3

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!

    
por somtam 28.02.2017 / 11:30

3 respostas

0

Isso funcionará:

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

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.)

    
por 28.02.2017 / 11:43
0

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"
    
por 28.02.2017 / 13:07