Arquivos em lote renomeando w / nome do arquivo

7

Eu tenho uma tonelada de arquivos nomeados desta forma: [name]_[phonenumber]_HH-mm-ss_dd-MM-yyyy.mp3 . Como posso deslocar [name] e [phonenumber] para o final do nome do arquivo e colocar a data no início na forma de yyyy-MM-dd_HH-mm-ss , então recebo yyyy-MM-dd_HH-mm-ss_[name]_[phonenumber] ?

Aqui está um nome de arquivo real: [Unknown]_[+74999519075]_18-01-36_17-01-2014.mp3

Eu tentei rename , mas devido à falta de conhecimento de regexp eu não encontrei uma solução de trabalho.

    
por firun 29.04.2014 / 16:14

2 respostas

7

Isso deve funcionar:

for i in *mp3; do rename 's/(.+?)_(.+?)_(.+?)-(.+?)-(.+?)_(.+?)-(.+?)-(.+?).mp3/$8-$7-$6_$3-$4-$5_$1_$2.mp3/' "$i"; done

Os parênteses capturam padrões. A 1ª correspondência capturada é $1 , o 2º $2 etc. Então, o comando acima:

  • procurará tudo até o primeiro _
  • .+? significa corresponder ao padrão mais curto possível devido ao ? ,
  • então tudo até o 2º _ etc.
  • e renomeia de acordo.

Eu testei com:

$ touch [name]_[phonenumber]_HH-mm-ss_dd-MM-yyyy.mp3
$ ls
[name]_[phonenumber]_HH-mm-ss_dd-MM-yyyy.mp3
$ for i in *mp3; do rename 's/(.+?)_(.+?)_(.+?)-(.+?)-(.+?)_(.+?)-(.+?)-(.+?).mp3/$8-$7-$6_$3-$4-$5_$1_$2.mp3/' "$i"; done
$ ls
yyyy-MM-dd_HH-mm-ss_[name]_[phonenumber].mp3
    
por terdon 29.04.2014 / 16:21
7

Usando apenas o seu exemplo, se tratarmos o sublinhado como um delimitador reservado, você poderá renomeá-lo assim:

rename 's/^([^_]+)_([^_]+)_([^_]+)_(\d+)-(\d+)-(\d+)/$6-$5-$4_$3_$1_$2/' *.mp3 -vn

O -vn no final significa que ele irá apenas informar o que ele faria no mundo real. Remova isso para que seja executado.

Aqui está meu equipamento de teste usando seu exemplo:

$ rename 's/^([^_]+)_([^_]+)_([^_]+)_(\d+)-(\d+)-(\d+)/$6-$5-$4_$3_$1_$2/' *.mp3 -vn
[Unknown]_[+74999519075]_18-01-36_17-01-2014.mp3 renamed as 2014-01-17_18-01-36_[Unknown]_[+74999519075].mp3
    
por Oli 29.04.2014 / 16:22