Renomeia arquivos aleatoriamente, mas sem repetição

1

Suponha que eu tenha uma pasta com muitos nomes de arquivos alguns muito estranhos e sem sentido Quero renomeá-lo como

File-1
File-2
File-3
..

Eu tentei isso (o echo é para tryng)

for name in *; do echo mv $name File-'echo $(( RANDOM % (10 - 5 + 1 ) + 1 ))';done

Mas me dê muitas duplicatas

mv bio1 file-3
mv memory23 file-1
mv mernad file-3
mv nio2 file-4
mv nun3 file-4
    
por elbarna 04.02.2016 / 04:04

4 respostas

5

Você poderia talvez usar shuf (do pacote GNU coreutils), que gera permutações em vez de amostras aleatórias individuais - algo como

for f in *; do read i; echo mv -- "$f" "file-$i"; done < <(shuf -i 1-10)

ou (talvez melhor) embaralhar os nomes de arquivos - e simplesmente renomeá-los sequencialmente

i=1; shuf -z -e -- * | while IFS= read -rd '' f; do echo mv -- "$f" "File-$((i++))"; done
    
por 04.02.2016 / 04:27
1

Aleatório pode retornar um valor duplicado. Que tal gerar números em sequência?

count=0
for name in *; do count='expr $count + 1' ; echo mv $name File-$count;done
    
por 04.02.2016 / 04:31
1

Se você quiser que os nomes dos arquivos estejam ordenados (por exemplo, File-1 - > File-n) no final, faça-os sequencialmente. -

count=0; for i in * ; do mv $i file-${count}; ((count++)); done 
    
por 04.02.2016 / 04:33
1
pre=file ;
for old in * ;
 do new='xxd -l 16 -ps /dev/urandom' ;
 while [ -f "$pre-$new" ] ; do new='xxd -l 16 -ps /dev/urandom' ; done ;
 mv "$old" "$pre-$new" ;
done ;

xxd é um binário que geralmente vem com: vim-common package.

O atributo

xxd -l refere-se ao comprimento aleatório que você deseja.

xxd -ps é para obter nomes de estilo simples hexadump postscript, por exemplo: a4c794f3861f5d3e36ca9b0afd15ceab

/dev/urandom é o gerador de números pseudo-aleatórios do kernel do Linux, se você não tiver, apenas escreva: mknod -m 444 /dev/urandom c 1 9

o comando while [ -f "$pre-$new" ] garante que nenhum outro arquivo tem o mesmo nome.

o comando [ geralmente vem em coreutils package.

a variável pre é escolher um prefixo de nome. Se você não quiser um prefixo, pode deixar em branco: pre= ;

Por exemplo:

file 1
file 2
file 3
file 4
file 5

Com pre=file se torna:

file-062b9bcde91f1c56084956d175cfdfa3
file-3e7ec1bd5324a485a3402b106d320f73
file-648cf4550c70b2531350f231670fc982
file-074b2828b004f45581784ff1705c7ff3
file-481be2bb21f4b1e637293ae0ecf14f74
    
por 04.02.2016 / 04:29