¿Cómo cambiar el nombre de archivos por lotes con "variables"?

¿Cómo cambiar el nombre de archivos por lotes con "variables"?

Utilizo xmbc para ver mis programas de televisión. Antes de comenzar a usar xmbc, descargué por lotes las primeras temporadas de "Bleach". Qué puedo decir, soy fanático del anime ;-). Estos se denominan: "bleachxx.mp4" donde xx es el número de episodio con respecto altoda la serie, no a la temporada. entonces "bleach21.mp4" es el primer episodio de la segunda temporada y el 21 en general. Sin embargo, los archivos en sí están divididos en sus propias carpetas de temporada.

Sé que puedes usar el comando "cambiar nombre" para cambiar el nombre de los archivos por lotes. Después de muchos retoques usando esta guía:http://tips.webdesign10.com/how-to-bulk-rename-files-in-linux-in-the-terminalRecibí este comando:

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

El problema es que el comando cambiará el nombre de todos los archivos a "Bleach S0XExx", pero debido a que los archivos tienen los números de archivo generales, blanqueador52.mp4 --> 'Bleach S03E52.mp4' cuando obviamente no hay 52 episodios en la temporada 3.

Entonces me gustaría saber si hay alguna forma de aplicar operaciones matemáticas al cambio de nombre del archivo. Esto resolvería el problema ya que podría restar el número de episodios de las temporadas anteriores por el número total y esencialmente obtener el número de temporada.

Ejemplo: si hay 20 episodios en la temporada 1, entonces 25-20 = 5, por lo que el episodio 25 es el quinto de la temporada 2 y el cambio de nombre se realizará normalmente.

Entonces, ¿hay alguna forma de cambiar los valores de cambio de nombre aplicando operaciones matemáticas?

PD: Perdón por la larga explicación, pero no estaba seguro de cómo hacerlo o si mi pregunta quedaría clara sin ella.

Respuesta1

Si está lo suficientemente dedicado a jugar con expresiones regulares (en el ejemplo que se le proporciona), le sugiero que vaya un paso más allá y escriba un pequeño script, digamos, en Python. De esta manera podrás realizar absolutamente cualquier transformación en los nombres de los archivos.

Calculo que el script de Python no tendrá más de 15 a 20 líneas, por lo que definitivamente no es una tarea enorme. Usar solo expresiones regulares, como lo estás intentando, es mucho más limitado.

Aquí está mi opinión sobre dicho guión:

#!/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 subestimé el tamaño del script (son 36 líneas atm), aunque estoy seguro de que si vas a stackoverflow con este código, obtendrás muchas sugerencias que son mucho más elegantes.

Y solo porque dije que se puede hacer en 15 líneas... las siguientes son 20 líneas, 5 de las cuales son configuración :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

Respuesta2

Te escribí un script en Python

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()

Soy realmente nuevo en Python (en parte por eso escribí esto, para practicar), por lo que probablemente no sea el mejor script del mundo. Pero lo probé con algunos archivos de prueba y parece funcionar.

Simplemente edite la línea cerca de la parte superior episode_counts = ...hasta los números del último episodio de una temporada. Puse los primeros tres deesta página.

Guarde el código como algo así episode_renamer.pyy utilícelo con python episode_renamer.py /path/to/episodes/.

Respuesta3

Hay un administrador de archivos llamado Thunar disponible en el repositorio que tiene una opción de cambio de nombre masivo.

Consulte este sitio para obtener más información: http://thunar.xfce.org/pwiki/documentation/bulk_renamer

Puedes instalar thunar en el Centro de software o en la línea de comando con:

sudo apt-get install thunar

Hay otras formas de hacer esto en bash o escribiendo algún código, pero una herramienta gráfica probablemente le proporcionará lo que desea más rápido.

Respuesta4

Para continuar azotando a este caballo... si se trata de un cambio de nombre único, haría algo desechable 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

Si lo vas a utilizar más de una vez y para más de un tipo de episodio... entonces Python es el camino a seguir, y los ejemplos anteriores están bien.

información relacionada