"변수"를 사용하여 파일 이름을 일괄적으로 바꾸는 방법은 무엇입니까?

"변수"를 사용하여 파일 이름을 일괄적으로 바꾸는 방법은 무엇입니까?

나는 xmbc를 사용하여 TV 프로그램을 봅니다. xmbc를 사용하기 전에는 "Bleach"의 처음 몇 시즌을 일괄 다운로드했습니다. 무슨 말을 해야 할까요, 저는 애니메이션 팬입니다 ;-). 이름은 "bleachxx.mp4"입니다. 여기서 xx는 해당 에피소드의 에피소드 번호입니다.전체 시리즈, 시즌이 아닙니다. 따라서 "bleach21.mp4"는 시즌 2의 첫 번째 에피소드이자 전체 21번째 에피소드입니다. 그러나 파일 자체는 자체 시즌 폴더로 구분됩니다.

"이름 바꾸기" 명령을 사용하여 파일 이름을 일괄적으로 바꿀 수 있다는 것을 알고 있습니다. 이 가이드를 사용하여 많은 노력을 기울인 후:http://tips.webdesign10.com/how-to-bulk-rename-files-in-linux-in-the-terminal나는 다음 명령을 받았습니다.

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

문제는 명령이 모든 파일의 이름을 "Bleach S0XExx"로 바꾸지만 파일에 전체 파일 번호가 있기 때문에 시즌 3에 52개의 에피소드가 분명히 없을 때 블리치52.mp4 --> 'Bleach S03E52.mp4'라는 것입니다.

그렇다면 파일 이름 바꾸기에 수학적 연산을 적용할 수 있는 방법이 있는지 알고 싶습니다. 이전 시즌의 에피소드 수를 전체 수에서 빼고 본질적으로 시즌 번호를 얻을 수 있으므로 문제가 해결됩니다.

예: 시즌 1에 20개의 에피소드가 있는 경우 25-20=5이므로 25번째 에피소드는 시즌 2의 5번째 에피소드이며 이름 변경은 정상적으로 수행됩니다.

그렇다면 수학 연산을 적용하여 이름 바꾸기 값을 변경할 수 있습니까?

추신: 설명이 길어서 죄송합니다. 설명이 없으면 제 질문이 명확해질지 확신할 수 없었습니다.

답변1

정규식을 다룰 만큼 헌신적이라면(제공된 예에서) 한 단계 더 나아가 작은 스크립트(예: 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"

스크립트 크기(atm 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

답변2

나는 당신에게 파이썬 스크립트를 작성했습니다

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 = ...시즌의 마지막 에피소드 번호 상단 근처에 있는 줄을 편집하면 됩니다 . 저는 처음 3개부터 넣었어요이 페이지.

코드를 다음과 같이 저장하고 episode_renamer.py와 함께 사용하세요 python episode_renamer.py /path/to/episodes/.

답변3

저장소에는 대량 이름 바꾸기 옵션이 있는 Thunar라는 파일 관리자가 있습니다.

자세한 내용은 다음 사이트를 참조하세요. http://thunar.xfce.org/pwiki/documentation/bulk_renamer

소프트웨어 센터나 명령줄에서 다음을 사용하여 thunar를 설치할 수 있습니다.

sudo apt-get install thunar

Bash에서 이를 수행하거나 일부 코드를 작성하는 다른 방법이 있지만 그래픽 도구를 사용하면 원하는 것을 더 빠르게 얻을 수 있습니다.

답변4

이 말을 계속 채찍질하려면... 이것이 일회성 이름 변경이라면 다음과 같이 일회용 작업을 수행할 것입니다.

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을 사용하는 것이 좋습니다. 위의 예도 괜찮습니다.

관련 정보