Tenho uma série que não é numerada por temporada, mas por ordem absoluta, indo de 0 a 150 ou mais. Quero renumerar esses arquivos por temporada para que sejam coletados corretamente no Plex. Aqui está um exemplo (primeiros 5 arquivos) da aparência atual da pasta "Temporada 2":
'Show Name - 014 Episode Title 1 [480p] [x265].mkv'
'Show Name - 015 Episode Title 2 [480p] [x265].mkv'
'Show Name - 016 Episode Title 3 [480p] [x265].mkv'
'Show Name - 017 Episode Title 4 [480p] [x265].mkv'
'Show Name - 018 Episode Title 5 [480p] [x265].mkv'
e assim por diante.
Como você pode ver, a temporada começa numerada em 14 em vez de 1. Primeiro eu uso a ferramenta de renomeação do Nautilus para substituir - 0
por S02E
. Aqui está o que parece agora:
anon@anonpc:~/Downloads/sandbox$ ls
'Show Name S02E14 Episode Title 1 [480p] [x265].mkv'
'Show Name S02E15 Episode Title 2 [480p] [x265].mkv'
'Show Name S02E16 Episode Title 3 [480p] [x265].mkv'
'Show Name S02E17 Episode Title 4 [480p] [x265].mkv'
'Show Name S02E18 Episode Title 5 [480p] [x265].mkv'
Mas preciso que os números dos episódios comecem com 01. Este é o mais próximo que cheguei:
for i in {14..18}; do mv Show\ Name\ S02E$i*.mkv Show\ Name\ S02E$((i-13))*; done
Mas isso não funciona corretamente:
mv: target 'Show Name S02E18 Episode Title 5 [480p] [x265].mkv' is not a directory
Agora fica assim:
anon@anonpc:~/Downloads/sandbox$ ls
'Show Name S02E14 Episode Title 1 [480p] [x265].mkv'
'Show Name S02E2*'
'Show Name S02E3*'
'Show Name S02E4*'
'Show Name S02E5*'
Você pode ver que o primeiro curinga *
funcionou para pegar os nomes completos dos arquivos, mas o restante não foi respeitado ao mv
renumerar os arquivos. Além disso, não tenho ideia de por que o primeiro item da lista não foi renomeado.
Gostaria de saber como poderia renumerar os arquivos da maneira descrita acima, mantendo o nome do arquivo original em ambos os lados do número inteiro. Estou usando o Ubuntu 22.04 com o shell bash padrão. Obrigado
O globing Bash funciona apenas para arquivos existentes. Nesse caso, você pode simplesmente usar a remoção do prefixo Bash (
${variable#prefix_to_remove}
) para especificar o destino de renomeação desejado:Execução de teste:
Você pode usar a opção de classificação de versão no GNU
sort
ou no GNUls
darename
seguinte forma:... ou então:
([^\d]+)
é um grupo de captura para não numéricos e([\d]+)
é apenas para numéricos e$1
,$2
,$3
... etc. são seus números de referência ... você pode precisar ajustá-los dependendo dos padrões de caracteres em seus nomes de arquivos.Observe que eles falharão se seus nomes de arquivos contiverem caracteres de nova linha.
A
-n
opçãorename
é para o modo de simulação (nenhuma renomeação de arquivo real acontece no sistema de arquivos) ... Então, tente isso e se você concordar com a saída, execute novamente novamente sem a-n
opção derename
como esta demonstração:Isso tem a vantagem de lidar automaticamente com quaisquer sequências de numeração arbitrárias/variantes e ainda renomeá-las para números sequenciais começando
1
e com base em seu estado de classificação original.