Como renomear em lote arquivos com “variáveis”? [duplicado]

2

Eu uso o xmbc para ver meus programas de TV. Antes de começar a usar o xmbc, fiz o download das primeiras temporadas de "Bleach". O que posso dizer, sou um fã de anime ;-). Estes são nomeados: "bleachxx.mp4" onde xx é o número do episódio em relação à série inteira , não à temporada. so "bleach21.mp4" é o primeiro episódio da segunda temporada e o 21º geral. Os arquivos em si são, no entanto, divididos em suas próprias pastas de temporada.

Eu sei que você pode usar o comando "rename" para renomear arquivos em lote. Depois de muito mexer com ele usando este guia: link Eu recebi este comando:

rename -n 's/.*(\d{2}).*$/Bleach S0XE$1/' *

O problema é que o comando irá renomear todos os arquivos em "Bleach S0XExx", mas como os arquivos possuem os números de arquivos gerais, bleach52.mp4 - > 'Bleach S03E52.mp4' quando obviamente não há 52 episódios na terceira temporada.

Eu gostaria de saber, então, se há alguma maneira de aplicar operações matemáticas à renomeação de arquivos. Isso resolveria o problema, pois eu poderia subtrair o número de episódios nas temporadas anteriores pelo número geral e, essencialmente, obter o número da temporada.

Exemplo: se houver 20 episódios na 1ª temporada, 25-20 = 5, então o 25º episódio será o 5º da 2ª temporada e a renomeação será realizada normalmente.

Então, existe alguma maneira de mudar os valores de renomear aplicando operações matemáticas?

P.S. Sinto muito pela longa explicação, mas não sabia como ou se minha pergunta seria clara sem ela.

    
por deox 27.10.2011 / 02:20

5 respostas

5

Se você é dedicado o suficiente para mexer com expressões regulares (no exemplo fornecido), sugiro apenas ir um passo adiante e escrever um pequeno script - digamos, em Python. Dessa forma, você poderá realizar absolutamente quaisquer transformações nos nomes de arquivos.

Eu estimaria que o script python não teria mais do que 15 a 20 linhas, então definitivamente não é uma tarefa enorme. Usar apenas regexps, como você está tentando, é muito mais limitado.

Aqui está minha opinião sobre esse roteiro:

#!/usr/bin/python
import os,re

files = os.listdir('.')

SEASONS = (
 (1, 1, 3), # the format is - season number, first episode, last episode
 (2, 50,52),
 (3, 53,55),
 (4, 56,99),
)

for f in files:
    # skip all files which are not .mp4
    if not f.endswith(".mp4"):
        continue

    # find the first number in the filename
    matches = re.findall("\d+", f)
    if not len(matches):
       print "skipping", f
    num = int(matches[0])

    for season in SEASONS:
        if num <= season[2]:
            season_num = season[0]
            ep_num = num - season[1] + 1
            new_file_name = "BleachS%02dE%02d.mp4" % (season_num, ep_num)
            # This is for testing
            print "%s ==> %s" % (f, new_file_name)
            # Uncomment the following when you're satisfied with the test runs
            # os.rename(f, new_file_name)
            break

print "Done"

Parece que eu subestimei o tamanho do script (é de 36 linhas atm), embora eu tenha certeza que se você for para stackoverflow com este código, você terá muitas sugestões que são muito mais elegantes

E só porque eu disse que pode ser feito em 15 linhas ... o seguinte é 20 linhas, das quais 5 são de configuração: P

#!/usr/bin/python
import os, re, glob

SEASONS = (
 {'num':1, 'first':1, 'last':3}, # the format is - season number, first episode, last episode
 {'num':2, 'first':50, 'last':52},
 {'num':3, 'first':53, 'last':55},
 {'num':4, 'first':56, 'last':99},
)

files = glob.glob('bleach*.mp4')
for f in files:
    num = int(re.findall("\d+", f)[0])  # find the first number in the filename
    for season in SEASONS:
        if num > season['last']: continue
        new_file_name = "BleachS%02dE%02d.mp4" % (season['num'], num - season['first'] + 1)
        print "%s ==> %s" % (f, new_file_name) # This is for testing
        # os.rename(f, new_file_name) # Uncomment this when you're satisfied with the test runs
        break
    
por Sergey 27.10.2011 / 02:32
2

Eu escrevi um script python para você

import sys
import os
import glob
import re

def rename():
    episode_counts = (0, 20, 41, 63)
    episode_pairs = []
    for index, num in enumerate(episode_counts):
        if index < len(episode_counts) - 1:
            episode_pairs.append((num, episode_counts[index+1]))

    episodes = glob.glob(os.path.join(sys.argv[1], '*'))

    for episode in episodes:
        match = re.search('.*(\d{2}).*$', os.path.basename(episode))
        episode_num = match.group(1)

        for season, pair in enumerate(episode_pairs):
            if int(episode_num) in range(pair[0]+1, pair[1]+1):
                dirname = os.path.dirname(episode)
                path = os.path.join(dirname, 'Bleach S{0}E{1}'.format(season+1, episode_num))
                os.rename(episode, path)

if __name__ == "__main__":
    rename()

Sou muito novo no python (que é em parte o motivo pelo qual escrevi isso, para praticar), então provavelmente não é o melhor script do mundo. Mas eu tentei em alguns arquivos de teste e parece funcionar.

Basta editar a linha perto do topo episode_counts = ... para os últimos números de episódio de uma temporada. Eu coloquei os três primeiros de esta página.

Salve o código como algo como episode_renamer.py e use-o com python episode_renamer.py /path/to/episodes/ .

    
por Kris Harper 27.10.2011 / 04:03
2

Existe um gerenciador de arquivos chamado Thunar disponível no repositório que possui uma opção de renomeação em massa.

Veja este site para mais informações: link

Você pode instalar o thunar no Centro de Software ou na linha de comando com:

sudo apt-get install thunar

Existem outras maneiras de fazer isso no bash, ou escrevendo algum código, mas uma ferramenta gráfica provavelmente fará o que você quer mais rápido.

    
por Omegamormegil 27.10.2011 / 03:50
1

Estou desenvolvendo um aplicativo de área de trabalho de plataforma cruzada que permite renomear um conjunto de arquivos de um padrão especificado para outro. O usuário pode especificar os dois padrões.

Você pode fazer o download em este link (é chamado: file-renamer-swt ). E aqui está o site principal do projeto .

    
por Nahuel Barrios 15.05.2013 / 04:41
1

Para continuar a flogging este cavalo ... se esta for uma renomeação única, eu faria algo descartável como:

cd /path/to/stuff
ls bleach*-lq.mp4 >x
paste x x >y
sed 's-^-mv -' <y >z
vim z    # or use your favorite editor
           # to rename the files manually
bash -x z
rm x y z

Se você for usá-lo mais de uma vez, e para mais de um tipo de episódio ... então o python é o caminho a seguir, e os exemplos acima são bons.

    
por qneill 02.11.2011 / 03:32