他のキャラクターをキャプチャした後にすべての点を変える方法

他のキャラクターをキャプチャした後にすべての点を変える方法

perl-rename一部のプログラムの名前を変更するには、このコマンドを使用しようとします。現在の形式は次のとおりです。

series.S01E**.title.of.the.episode.mkv

アスタリスクはエピソード番号のプレースホルダーです。

次のように名前を変更したいと思います。

[Series] - S01E** - title of the episode.mkv

シリーズ名とエピソード名をうまくキャプチャしましたが、何かをマッチさせた後にドットを変える方法がわかりません。

perl-rename 's/(\w+)\.(S\d{2}E\d{2})\./[\u$1] - $2 - /' -n *.mkv
                                     ^ No idea what to insert here

電話した通話renameが私の目標でした。タイトルの長さはランダムに変わる可能性があるため、(\w+)\.(\w+).../$1 $2... # match a word and a dot決まった回数だけ行うことはできません。

私が探しているのは基本的にmatchですword.

答え1

努力する:

perl-rename -n 's{(\w+)\.(S\d{2}E\d{2})\.(.*)(\.mkv)\Z}{
  "[\u$1] - $2 - " . ($3 =~ y/./ /r) . $4}es' ./*.mkv
  • perl実装ベースrename(すべて以下から派生)このrenameスクリプトperl(1989年初めにPerl 3に付属)、引数として提供されたファイルの名前を$_最初の引数に指定されたコードの変更された値に変更します。perl
  • s{regex}{replacement}flagss/regex/replacement/flags、のような略語です$_ =~ s{regex}{replacement}flag。つまり、$_名前を変更するファイルの名前を含む変数に代替演算子が適用されます。
  • ここバナー包含は、e置換がPerlコードとして解釈され、e置換を生成するために評価されることを意味します。
  • また、このsフラグを使用して、.通常使用したい改行と一致させます。rename改行はファイル名のすべての文字と同じくらい有効なためです。これがwhichの\Z代わりに(トピックの最後に一致)を使用する理由でもあります。ただし、トピックの末尾の改行文字の前にも使用できます。ただし、この場合、すべてのファイル名は改行文字ではなく改行文字で終わるため、影響はありません。$perlv
  • ($3 =~ y/./ /r)y(別名)演算子をtr3番目のキャプチャグループに適用します。このrフラグを使用すると、置換は内部には適用されませんが($3どうせ読み取り専用です)、r代替結果が返されます。

個人的に私は代わりにzsh'を使用しますzmv

autoload -Uz zmv
zmv -n '(*).(S<1-99>E<1-99>).(*)(.mkv)' '[${(C)1}] - $2 - ${3//./ }$4'

ここで、${(C)1}前のセクションの各単語(連続番号)は大文字で表示されます./SXXEYY(たとえば、foo.Bar-BAZに変更されます)。Foo.Bar-Baz

利点rename:

  • 実装は1つしかありません(数十のバリエーションがありますrename)。
  • series.S01E01.title x.mkv名前を変更する前に、いくつかの完全性チェックを実行します(例:Serias.S01E01.title.x.mkv
  • rename--(すべてサポートされていません)またはプレフィックスを忘れた場合、一部の./Perlバリアントにはランダムなコマンド注入の脆弱性があります。
  • ASCII以外のファイル名(épisode大文字Épisodeなど)でも機能します。

答え2

sedあるいは、スクリプトと同様に、perlPerlスクリプトには複数のステートメントがあります(区切りまたは;複数のオプションを使用)。たとえば、-erename

$ touch 'my.series.name.S01E'{01..03}'.title.of.the.episode.mkv'
$ ls -l
total 6
-rw-r--r-- 1 cas cas   0 Jun  7 10:56 my.series.name.S01E01.title.of.the.episode.mkv
-rw-r--r-- 1 cas cas   0 Jun  7 10:56 my.series.name.S01E02.title.of.the.episode.mkv
-rw-r--r-- 1 cas cas   0 Jun  7 10:56 my.series.name.S01E03.title.of.the.episode.mkv

$ rename 's/\./ /g; s/ (mkv)$/.$1/; s/^(.*) (S\d\dE\d\d) /[\u$1] - $2 - /' *.mkv
$ ls -l
total 6
-rw-r--r-- 1 cas cas   0 Jun  7 10:57 [My series name] - S01E01 - title of the episode.mkv
-rw-r--r-- 1 cas cas   0 Jun  7 10:57 [My series name] - S01E02 - title of the episode.mkv
-rw-r--r-- 1 cas cas   0 Jun  7 10:57 [My series name] - S01E03 - title of the episode.mkv

スクリプトの名前を変更する:

  • .すべての文字(.mkv拡張子の前の文字を含む)を空白に置き換えます。

  • 拡張子の前のスペースを変更してください。現在、この機能は.mkvファイルでのみ機能しますが、たとえば他のコンテナ形式のビデオがある場合に.簡単に変更できます。s/ (mkv)$/.$1/s/ (mkv|avi|mp4)$/.$1/

    たとえば、複数の「拡張子」を持つファイル名を処理する必要がある場合は、より多くの作業が必要.xyz.mp4です。

  • ファイル名のシリーズ名とエピソード番号の部分をに戻します[Series] - SnnEnn -。エピソードのタイトルと拡張子は、最初の2つのコマンド以降はそのまま残ります。

[注:これらのファイルを処理する別のシェルスクリプトを作成する場合は、ファイル名にスペースと文字の両方が含まれているため、ファイル名のすべての変数を二重引用符で囲む必要があります]。とにかく変数を参照する必要があるため、これは大きな問題ではありません。

ただし、スクリプトのステートメントはrename有効なPerlコードでもインストールされているusePerlモジュールでもかまいません。すべての文がファイル名を直接変更する必要はありません。たとえば、コードを使用してカウンタを増やしたり、statファイル名に対して実行してサイズやタイムスタンプなどを確認したりできます。あるいは、データベースを照会するか、Web API呼び出しを介して調べることもできます。ファイル名にエピソードのタイトルがない場合)。変更すると、$_ファイル名が変更されます。

関連情報