web-dev-qa-db-ja.com

「変数」でファイルの名前を一括変更する方法は?

私はテレビ番組を見るためにxmbcを使用しています。 xmbcの使用を開始する前に、「ブリーチ」の最初の数シーズンをバッチダウンロードしました。私は何と言ってもいい、私はアニメファンです;​​-)。これらの名前は「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のエピソードがない場合、ファイルの全体的なファイル番号はbleach52.mp4-> 'Bleach S03E52.mp4'であるためです。

それから、ファイル名の変更に数学的な操作を適用する方法があるかどうかを知りたいです。これにより、前のシーズンのエピソードの数を全体の数で減算し、本質的にシーズンの数を取得できるため、問題が解決します。

例:シーズン1に20のエピソードがある場合、25-20 = 5であるため、25番目のエピソードはシーズン2の5番目であり、名前の変更は通常どおり実行されます。

それでは、とにかく、数学演算を適用して名前変更の値を変更する必要はありますか?

追伸長い説明をして申し訳ありませんが、どうすればよいのか、それなしで質問が明確になるかどうかはわかりませんでした。

2
deox

正規表現をいじくり回すことに専念している場合(提供されている例では)、さらに一歩進んで小さなスクリプト(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
Sergey

Thunarというファイルマネージャーがリポジトリにあり、一括名前変更オプションがあります。

詳細については、このサイトを参照してください: http://thunar.xfce.org/pwiki/documentation/bulk_renamer

Thunarは、ソフトウェアセンターまたはコマンドラインで以下を使用してインストールできます。

Sudo apt-get install thunar

これをbashで行う方法やコードを記述する方法は他にもありますが、グラフィカルツールを使用すると、必要なものをより高速に取得できます。

2
Omegamormegil

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

私はpythonを初めて使用します(これが、実際にこれを書いた理由の一部です)。したがって、おそらく世界で最高のスクリプトではありません。しかし、いくつかのテストファイルで試してみたところ、うまくいくようです。

一番上のepisode_counts = ...の近くの行を、シーズンの最後のエピソード番号に編集するだけです。 このページ から最初の3つを入れました

コードをepisode_renamer.pyのようなものとして保存し、python episode_renamer.py /path/to/episodes/で使用します。

2
Kris Harper

一連のファイルの名前を指定されたパターンから別のパターンに変更できるクロスプラットフォームのデスクトップアプリケーションを開発しています。ユーザーは両方のパターンを指定できます。

このリンク (名前:file-renamer-swt)からダウンロードできます。そして、これは プロジェクトメインサイト です。

1
Nahuel Barrios

この馬のむち打ちを続けるには...これが1回限りの名前変更である場合、次のような使い捨てのことをします。

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を使用します。上記の例は問題ありません。

1
qneill