Diretório de renomeação em massa para mover o ano do final para o início

11

Atualmente, estou lutando com algumas pastas de músicas. Uma vez decidi nomeá-los seguindo o padrão: artist - album - year . Percebi hoje que isso não foi uma jogada inteligente e quero agora nomear meus diretórios seguindo o padrão: year - artist - album , pois eles aparecerão em ordem crescente quando listados.

Comecei a fazer a renomeação manualmente, mas, com aproximadamente 700 pastas, tem que haver uma maneira mais simples; Eu tentei usar gprename , mas não sou tão bom em regex e bash scripting ...

Existe alguém que possa me ajudar a poupar meus dedos pobres?

Alguns exemplos:

Aes Dana - Memory Shell - 2004 
Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009

se tornaria

2004 - Aes Dana - Memory Shell
2009 - Anja Schneider & GummiHz - Back To Back (Remixes Part 2)

EDIT: Alguns nomes de artistas e álbuns possuem caracteres especiais como And.Id ou Kool & The Gang . Embora todo diretório tenha - como separador.

    
por TazMayhem 29.03.2017 / 10:12

2 respostas

16

Supondo que você tenha acesso ao perl rename (geralmente disponível no Ubuntu - graças ao @Serg para esclarecer a diferença. Em caso de dúvida, ligue para /usr/bin/rename e você deve escolher o caminho certo), você pode usar:

rename -n 's/(.*) - (\d{4})\// - /' */

Remova -n após o teste para realmente renomear os diretórios. Isto assume que todos os álbuns datam entre 1000 e 9999. Provavelmente razoável ...

Explicação

  • s/old/new replace old com new
  • (.*) salva qualquer número de caracteres para referenciar como depois
  • (\d{4})\/ salve quatro dígitos no final da linha para fazer referência como depois.
  • */ corresponde a todos os diretórios (não arquivos - graças ao @muru para ajuda!)
por Zanna 29.03.2017 / 10:26
6

O script Python simples pode fazer esse trabalho:

$ tree
.
├── Aes Dana - Memory Shell - 2004
├── Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009
└── rename_dirs.py

2 directories, 1 file
$ ./rename_dirs.py */
$ tree
.
├── 2004 - Aes Dana  -  Memory Shell 
├── 2009 - Anja Schneider & GummiHz  -  Back To Back (Remixes Part 2) 
└── rename_dirs.py

Conteúdo do script:

#!/usr/bin/env python
from shutil import move;
import sys

for i in sys.argv[1:] :
    parts = i[:-1].split('-')
    year = parts[-1].strip()
    new_name = year + " - " + " - ".join(parts[:-1]).strip()
    move(i,new_name)

Como isso funciona:

  • O principal truque é que executamos scripts do mesmo diretório em que os destinos residem. Também passamos */ para fornecer apenas diretórios como argumentos para o script
  • O script percorre todos os argumentos da linha de comando, dividindo cada nome de arquivo em lista de seqüências de caracteres no caractere - . O novo nome de arquivo é construído a partir de partes extraídas.
  • A função move() do shutils module é o que realmente renomeia os diretórios

Observe o uso: ./rename_dirs.py */

    
por Sergiy Kolodyazhnyy 29.03.2017 / 10:44