Как переименовать файлы с помощью & ldquo; variables & rdquo ;? [Дубликат]

Fogger можно установить с помощью репозитория Launchpad ppa: loneowais / fogger

sudo add-apt-repository ppa:loneowais/fogger

sudo apt-get update

sudo apt-get install fogger
2
задан 27 October 2011 в 05:20

13 ответов

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

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

Вот мой подход к такому сценарию:

#!/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 строк atm), хотя я уверен, что если вы перейдете к 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
ответ дан 25 May 2018 в 17:33
  • 1
    Не могли бы вы дать мне общее представление о том, как это сделать, или ссылки на учебные пособия. Я никогда не писал код, поэтому я не уверен, насколько я могу это сделать. Прежде всего, как писать на определенном языке? (да, я из нуба, но я определенно хочу учиться) – DeoxNa 27 October 2011 в 06:01
  • 2
    Ха-ха, ты намного чище, чем моя. – Kris Harper 27 October 2011 в 07:09
  • 3
    Это сработало! (оба они) Большое спасибо! Хотя я должен сказать, что в первый раз выход не вышел правильно (в тесте) для любого из них. Затем я заметил, что в своем посте я не упомянул, что файлы на самом деле названы «bleachxx-lq.mp4», поэтому я исправил это в строке 13 вашего финального скрипта и вуаля! Однако случилось что-то странное. Я еще раз попробовал сценарий, используя ваш первый скрипт, и он работал правильно, хотя я не модифицировал его (за пределами сезонных номеров). Go figure ... В любом случае спасибо еще раз, но, просто из любопытства, почему оба скрипта работают сейчас? – DeoxNa 27 October 2011 в 08:13

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

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

Вот мой подход к такому сценарию:

#!/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 строк atm), хотя я уверен, что если вы перейдете к 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
ответ дан 2 August 2018 в 02:40

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

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

Вот мой подход к такому сценарию:

#!/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 строк atm), хотя я уверен, что если вы перейдете к 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
ответ дан 4 August 2018 в 18:27

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

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

Вот мой подход к такому сценарию:

#!/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 строк atm), хотя я уверен, что если вы перейдете к 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
ответ дан 15 August 2018 в 21:43

Я написал вам скрипт 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
ответ дан 25 May 2018 в 17:33
  • 1
    Интересно посмотреть на чужой подход к той же проблеме :) Приятно! – Sergey 27 October 2011 в 07:28
  • 2
    Благодаря! Я использовал Сергея в своих реальных файлах, но попробовал свои файлы на некоторых тестовых файлах. Это дало мне следующие ошибки: Traceback (последний последний вызов): File " / home / david / Documents / 1st & quot ;, строка 27, в & lt; module & gt; rename () File " / home / david / Documents / 1st & quot ;, строка 14, в эпизодах переименования = glob.glob (os.path.join (sys.argv [1], '*')) IndexError: list index out диапазона Вы сказали, что хотите практиковать на python, так что это может помочь вам, пытаясь найти ошибки. Я сохраню его ваш сценарий, хотя я также хочу его изучить. В любом случае, спасибо за вашу помощь! – DeoxNa 27 October 2011 в 08:18
  • 3
    @ user600: вы должны были использовать «python episode_renamer.py / path / to / episodes / " синтаксис - я думаю, что сценарий завершится неудачно, если вы не укажете путь к папке – Sergey 27 October 2011 в 08:39

В репозитории имеется файловый менеджер Thunar, который имеет опцию переименования большого объема.

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

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

sudo apt-get install thunar

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

2
ответ дан 25 May 2018 в 17:33

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

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

1
ответ дан 25 May 2018 в 17:33

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

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

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

1
ответ дан 25 May 2018 в 17:33

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

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

1
ответ дан 25 July 2018 в 20:57

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

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

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

1
ответ дан 25 July 2018 в 20:57

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

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

1
ответ дан 2 August 2018 в 02:40

Я написал вам скрипт 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
ответ дан 7 August 2018 в 20:34

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

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

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

1
ответ дан 7 August 2018 в 20:34

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

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