web-dev-qa-db-fra.com

Comment renommer par lots des fichiers avec des "variables"?

J'utilise xmbc pour voir mes émissions de télévision. Avant de commencer à utiliser xmbc, j’ai téléchargé par lot les premières saisons de "Bleach". Que puis-je dire, je suis un fan d'anime ;-). Ceux-ci sont nommés: "bleachxx.mp4" où xx est le numéro de l'épisode par rapport à la série entière et non à la saison. donc "bleach21.mp4" est le 1er épisode de la deuxième saison et le 21ème au général. Les fichiers eux-mêmes sont toutefois divisés en leurs propres dossiers de saison.

Je sais que vous pouvez utiliser la commande "renommer" pour renommer des fichiers par lots. Après avoir beaucoup bricolé avec ce guide: http://tips.webdesign10.com/how-to-bulk-rename-files-in-linux-in-the-terminal J'ai reçu cette commande:

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

Le problème est que la commande renommera tous les fichiers en "Bleach S0XExx", mais parce que les fichiers portent les numéros de fichier globaux, bleach52.mp4 -> 'Bleach S03E52.mp4' alors qu’il n’ya évidemment pas 52 épisodes de la saison 3.

J'aimerais donc savoir s'il existe un moyen d'appliquer des opérations mathématiques au changement de nom de fichier. Cela résoudrait le problème car je pouvais soustraire le nombre d'épisodes des saisons précédentes par le nombre total et obtenir essentiellement le numéro de la saison.

Exemple: s'il y a 20 épisodes dans la saison 1, alors 25-20 = 5, le 25ème épisode est donc le 5ème de la saison 2 et le changement de nom se déroulerait normalement.

Alors, est-il possible de changer les valeurs de changement de nom en appliquant des opérations mathématiques?

P.S. Je suis désolé pour la longue explication, mais je n’étais pas sûr de savoir comment ou si ma question serait claire sans elle.

2
deox

Si vous vous consacrez suffisamment à bricoler avec des expressions régulières (dans l'exemple que vous avez fourni), je vous suggère simplement d'aller un peu plus loin et d'écrire un petit script - disons en Python. De cette façon, vous pourrez effectuer absolument toutes les transformations de noms de fichiers.

J’estimerais que le script python n’aurait pas plus de 15 à 20 lignes, donc ce n’est certainement pas une tâche énorme. L'utilisation de regexps, comme vous essayez, est beaucoup plus limitée.

Voici mon point de vue sur ce script:

#!/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"

On dirait que j'ai sous-estimé la taille du script (36 lignes atm), mais je suis sûr que si vous utilisez stackoverflow avec ce code, vous obtiendrez de nombreuses suggestions beaucoup plus élégantes.

Et juste parce que j'ai dit que cela peut être fait en 15 lignes ... la suivante est 20 lignes, dont 5 est la configuration: 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
5
Sergey

Un gestionnaire de fichiers appelé Thunar, disponible dans le référentiel, dispose d'une option de renommage en masse.

Voir ce site pour plus d'informations: http://thunar.xfce.org/pwiki/documentation/bulk_renamer

Vous pouvez installer thunar dans le Centre logiciel ou en ligne de commande avec:

Sudo apt-get install thunar

Il existe d'autres moyens de le faire en bash ou en écrivant du code, mais un outil graphique vous permettra probablement d'obtenir ce que vous voulez plus rapidement.

2
Omegamormegil

Je vous ai écrit un script 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 __== "__main__":
    rename()

Je suis vraiment nouveau dans python (ce qui est en partie la raison pour laquelle j'ai écrit ceci, pour la pratique), donc ce n'est probablement pas le meilleur script au monde. Mais je l'ai essayé sur quelques fichiers de test et cela semble fonctionner.

Il suffit de modifier la ligne près du haut episode_counts = ... vers les derniers numéros d’épisode d’une saison. Je mets dans les trois premiers de cette page.

Enregistrez le code sous la forme episode_renamer.py et utilisez-le avec python episode_renamer.py /path/to/episodes/.

2
Kris Harper

Je développe une application de bureau multiplate-forme qui vous permet de renommer un ensemble de fichiers d'un modèle spécifié à un autre. L'utilisateur peut spécifier les deux modèles.

Vous pouvez le télécharger depuis ce lien (il s'appelle: file-renamer-swt ). Et voici le site principal du projet .

1
Nahuel Barrios

Pour continuer à fouetter ce cheval ... s'il s'agit d'un changement de nom une fois, je ferais quelque chose de jetable comme:

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 vous comptez l'utiliser plus d'une fois et pour plus d'un type d'épisode ..., alors python est la voie à suivre, et les exemples ci-dessus conviennent parfaitement.

1
qneill