MMV renomear arquivo em massa

6

Estou com problemas para descobrir um padrão mmv. Eu tenho um monte de arquivos de vídeo com esse padrão:

my.program.name.season.NN.episode.NN.-.title.avi

e preciso movê-los para:

my.program.name.sNNeNN.title.avi

Parece que não consigo obter o padrão certo ...

    
por Jocala 15.12.2014 / 20:36

3 respostas

5

TL; DR

rename -n 's/^((\w+\.+){3})(.).*\.(.*)\.(.).*\.(.*)\.\-(\..*)$/$1$3$4$5$6$7/' *
  • \w+ corresponde a um ou mais caracteres de palavras, ou seja, [a-zA-Z0-9_]+ [1]
  • \.+ corresponde a um ou mais caracteres de ponto ( . ) [2]

    Observe que \. corresponde ao caractere . . Precisamos usar \. para representar . , pois . tem um significado especial em regex. O \ é conhecido como o código de escape, que restaura o significado literal original do caractere seguinte.

  • (\w+\.+){3} corresponde ao máximo de 3 vezes de qualquer precisão acima de [1], [2] grupo de caracteres começando do início ( ^ corresponde ao início dos nomes) do nome dos arquivos.
    Isso corresponderá ou retornará my.program.name.

    Observe que parênteses extras em torno da regex são usados para agrupamento de correspondência. A correspondência de agrupamento começa com ( e termina com ) e é usada para fornecer as chamadas referências . Uma referência anterior contém a subcadeia correspondente armazenada em variáveis especiais $ 1 , $ 2 , , $ 9 , onde $ 1 contém a substring correspondente ao primeiro par de parênteses e assim por diante.

  • . O ponto do metacaractere (.) corresponde a qualquer caractere único. Por exemplo, ... corresponde a quaisquer 3 caracteres. então, com esse (.) , estamos igualando o primeiro caractere de season , que é s .

  • .*\. corresponde a tudo depois de um único caractere acima até primeiro . , se visto. Como você pode ver, não o capturamos como um grupo de correspondências porque queremos removê-lo do nosso nome, onde isso corresponde a eason. .

  • (.*) corresponde a tudo após a correspondência acima. Isso corresponde a NN . Parênteses usados aqui porque queremos manter isso no nome do arquivo.

  • \. corresponde a um único ponto após a correspondência acima. Um . após o primeiro NN .

  • (.) novamente com esse estamos igualando o primeiro caractere após a correspondência acima. isso retornará apenas e .

  • .*\. corresponderá a tudo após a correspondência acima até o primeiro . . Corresponderá a pisode. .

  • (.*) corresponde a qualquer coisa após o último ponto correspondente da correspondência acima. Isso corresponderá ao segundo NN .

  • \.\- corresponde a um ponto . seguido por um traço - . Corresponderá ou retornará .-

  • E finalmente (\..*)$ corresponde a um único ponto . e tudo depois disso, que termina no final do nome do arquivo. $ corresponde ao final do nome do arquivo ou string de entrada.

Observação: remova a opção -n para realizar renomeação real.

    
por 15.12.2014 / 22:34
1

Você pode torná-lo puro BASH:

netikras@netikras-netbook /tmp $ ls -l /tmp/*.*season.*episode.*avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.07.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.32.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.35.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.NN.episode.NN.-.title.avi

netikras@netikras-netbook /tmp $ for i in *.*season.*episode.*avi; do nn="${i/season./s}"; nn=${nn/.episode./e}; nn=${nn/.-./.}  ; echo "moving: $i ----> $nn"; mv $i $nn; done
moving: my.program.name.season.05.episode.07.-.title.avi ----> my.program.name.s05e07.title.avi
moving: my.program.name.season.05.episode.32.-.title.avi ----> my.program.name.s05e32.title.avi
moving: my.program.name.season.05.episode.35.-.title.avi ----> my.program.name.s05e35.title.avi
moving: my.program.name.season.NN.episode.NN.-.title.avi ----> my.program.name.sNNeNN.title.avi

Dessa forma, você não precisa chamar nenhum aplicativo externo, por exemplo, sed / awk, para executar o trabalho. O BASH pode modificar facilmente strings com ferramentas embutidas. Você acabou de substituir 3 partes do seu nome de arquivo e criar um novo. Então, tudo o que resta é atribuir o novo nome ao arquivo. Não há necessidade de aprender qualquer um desses regexes assustadores para fazer um trabalho simples.

    
por 16.12.2014 / 09:54
0

Tente fazer isso com rename :

do perl
rename -n 's/
            (.*?s)eason\.(\d{2})\.episode\.(\d{2})\.-\.(.*\.avi)
            /$1$2e$3.$4/x
' my.program.name*

Quando estiver satisfeito com o que você deseja, remova o -n para realizar a renomeação.

    
por 15.12.2014 / 20:44

Tags