Как пакетно переименовать файлы с помощью "переменных"? [duplicate]

Я использую xmbc для просмотра телепередач. До того, как я начал использовать xmbc, я загрузил несколько первых сезонов "Bleach". Что я могу сказать, я фанат аниме ;-). Они называются: "bleachxx.mp4", где xx - это номер эпизода по отношению к всему сериалу, а не к сезону. Так что "bleach21.mp4" - это 1-я серия второго сезона и 21-я в целом. Сами файлы, однако, разделены на собственные папки с сезонами.

Я знаю, что вы можете использовать команду "rename" для пакетного переименования файлов. После долгих поисков с помощью этого руководства: http://tips.webdesign10.com/how-to-bulk-rename-files-in-linux-in-the-terminal я получил вот такую команду:

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

Проблема в том, что команда переименует все файлы в "Bleach S0XExx", но поскольку файлы имеют общие номера, bleach52.mp4 --> 'Bleach S03E52.mp4', хотя в третьем сезоне явно нет 52 эпизодов.

Тогда я хотел бы узнать, есть ли способ применить математические операции к переименованию файлов. Это решило бы проблему, поскольку я мог бы вычесть количество эпизодов в предыдущих сезонах из общего числа и получить номер сезона.

Пример: Если в первом сезоне 20 серий, то 25-20=5, поэтому 25-я серия будет 5-й во втором сезоне, и переименование будет происходить как обычно.

Итак, есть ли способ изменить значения переименования, применяя математические операции?

P.S. Извините за длинное объяснение, но я не был уверен, как это сделать или будет ли мой вопрос понятен без него.

2
задан 27 October 2011 в 04:20

5 ответов

Если Вы выделены достаточно для переделывания регулярных выражений (в примере, Вам предоставляют), затем, я предлагаю только сделать один шаг дальше и записать, что в маленьком сценарии - говорится в Python. Таким образом, Вы сможете выполнить абсолютно любые преобразования к именам файлов.

Я оценил бы, что сценарий Python будет не более 15-20 строк долго, таким образом, это будет определенно не огромная задача. Используя просто regexps, поскольку Вы пробуете, намного более ограничено.

Вот мое взятие на таком сценарии:

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

Похоже, что я недооценил размер сценария (это - 36 банкоматов строк), хотя я уверен, переходите ли Вы к stackoverflow с этим кодом, Вы получите много предложений, которые намного более изящны

И просто потому что я сказал, что это может быть сделано в 15 строках... следующее является 20 строками, 5 из которых конфигурация :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
ответ дан 27 October 2011 в 04:20

Я записал Вам сценарий 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()

Я действительно плохо знаком с Python (который является частично, почему я записал это для практики), таким образом, это - вероятно, не лучший сценарий в мире. Но я попробовал его на нескольких тестовых файлах, и это, кажется, работает.

Просто отредактируйте строку около вершины episode_counts = ... к последним числам эпизода в течение сезона. Я вставил первые три от этой страницы.

Сохраните код как что-то как episode_renamer.py и используйте его с python episode_renamer.py /path/to/episodes/.

2
ответ дан 27 October 2011 в 04:20

В хранилище доступен файловый менеджер Thunar, который имеет опцию массового переименования.

См. Этот сайт для получения дополнительной информации: http://thunar.xfce.org/pwiki/documentation/bulk_renamer

Вы можете установить Thunar в Центре программного обеспечения или на командная строка с:

sudo apt-get install thunar

Существуют и другие способы сделать это в bash или написать некоторый код, но графический инструмент, вероятно, даст вам то, что вы хотите быстрее.

0
ответ дан 27 October 2011 в 04:20

Я разрабатываю кроссплатформенное настольное приложение, которое позволяет вам переименовывать набор файлов из указанного шаблона в другой. Пользователь может указать оба шаблона.

Вы можете скачать его с по этой ссылке (она называется: file-renamer-swt ). А вот и главный сайт проекта .

0
ответ дан 27 October 2011 в 04:20

Чтобы продолжить порку этой лошади ... если это одноразовое переименование, я бы сделал что-то одноразовое, например:

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

Если вы будете использовать его более одного раза и для более чем одного вроде эпизода ... тогда Python - это путь, и примеры, приведенные выше, просто хороши.

0
ответ дан 27 October 2011 в 04:20

Другие вопросы по тегам:

Похожие вопросы: