Wie benenne ich Dateien mit „Variablen“ stapelweise um?

Wie benenne ich Dateien mit „Variablen“ stapelweise um?

Ich verwende xmbc, um meine Fernsehsendungen anzusehen. Bevor ich xmbc benutzte, habe ich die ersten Staffeln von "Bleach" im Batch-Verfahren heruntergeladen. Was soll ich sagen, ich bin ein Anime-Fan ;-). Diese heißen: "bleachxx.mp4", wobei xx die Episodennummer in Bezug auf dieganze Serie, nicht auf die Staffel. also ist "bleach21.mp4" die 1. Folge der 2. Staffel und die 21. insgesamt. Die Dateien selbst sind allerdings in eigene Staffelordner aufgeteilt.

Ich weiß, dass man mit dem Befehl „Umbenennen“ mehrere Dateien gleichzeitig umbenennen kann. Nach langem Herumprobieren mit dieser Anleitung:http://tips.webdesign10.com/wie-man-in-linux-im-terminal-mehrere-Dateien-umbenenntIch habe diesen Befehl erhalten:

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

Das Problem besteht darin, dass der Befehl alle Dateien in „Bleach S0XExx“ umbenennt, die Dateien jedoch die Gesamtdateinummern „bleach52.mp4 --> ‚Bleach S03E52.mp4‘“ haben, obwohl Staffel 3 offensichtlich keine 52 Episoden umfasst.

Ich würde gerne wissen, ob es eine Möglichkeit gibt, mathematische Operationen auf die Dateiumbenennung anzuwenden. Dies würde das Problem lösen, da ich die Anzahl der Episoden in den vorherigen Staffeln von der Gesamtzahl abziehen und im Wesentlichen die Staffelnummer erhalten könnte.

Beispiel: Wenn Staffel 1 20 Episoden hat, ist 25-20=5. Die 25. Episode ist also die 5. von Staffel 2 und die Umbenennung wird wie gewohnt durchgeführt.

Gibt es also eine Möglichkeit, die Umbenennungswerte durch Anwenden mathematischer Operationen zu ändern?

PS: Entschuldigen Sie die lange Erklärung, aber ich war mir nicht sicher, wie das geht oder ob meine Frage ohne sie klar wäre.

Antwort1

Wenn Sie genug Hingabe haben, um mit regulären Ausdrücken herumzubasteln (wie im Beispiel, das Sie erhalten), dann schlage ich vor, noch einen Schritt weiter zu gehen und ein kleines Skript zu schreiben – beispielsweise in Python. Auf diese Weise können Sie absolut beliebige Transformationen an Dateinamen durchführen.

Ich schätze, das Python-Skript wäre nicht länger als 15-20 Zeilen, also ist es definitiv keine große Aufgabe. Die Verwendung von nur regulären Ausdrücken, wie Sie es versuchen, ist viel eingeschränkter.

Hier ist meine Meinung zu einem solchen Skript:

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

Es sieht so aus, als hätte ich die Größe des Skripts unterschätzt (es sind derzeit 36 ​​Zeilen), aber ich bin sicher, wenn Sie mit diesem Code zu Stackoverflow gehen, werden Sie viele Vorschläge bekommen, die viel eleganter sind

Und nur weil ich gesagt habe, dass es in 15 Zeilen erledigt werden kann... das Folgende sind 20 Zeilen, von denen 5 Konfiguration sind :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

Antwort2

Ich habe dir ein Python-Skript geschrieben

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

Ich bin ein echter Python-Neuling (was teilweise der Grund ist, warum ich das hier geschrieben habe, zur Übung), also ist es wahrscheinlich nicht das beste Skript der Welt. Aber ich habe es mit ein paar Testdateien ausprobiert und es scheint zu funktionieren.

Bearbeiten Sie einfach die Zeile oben episode_counts = ...bis zur letzten Episodennummer einer Staffel. Ich habe die ersten drei vondiese Seite.

Speichern Sie den Code als etwa wie episode_renamer.pyund verwenden Sie ihn mit python episode_renamer.py /path/to/episodes/.

Antwort3

Im Repository ist ein Dateimanager namens Thunar verfügbar, der über eine Option zur Massenumbenennung verfügt.

Weitere Informationen finden Sie auf dieser Website: http://thunar.xfce.org/pwiki/documentation/bulk_renamer

Sie können Thunar im Software Center oder über die Befehlszeile installieren mit:

sudo apt-get install thunar

Dies kann man zwar auch auf andere Weise in Bash oder durch das Schreiben von Code erreichen, mit einem grafischen Tool kommen Sie aber wahrscheinlich schneller ans Ziel.

Antwort4

Um das Ganze weiter zu provozieren... wenn es sich um eine einmalige Umbenennung handelt, würde ich etwas Wegwerfbares tun wie:

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

Wenn Sie es mehr als einmal und für mehr als eine Art von Episode verwenden möchten, ist Python die beste Wahl und die obigen Beispiele sind völlig ausreichend.

verwandte Informationen