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}flags
s/regex/replacement/flags
、のような略語です$_ =~ s{regex}{replacement}flag
。つまり、$_
名前を変更するファイルの名前を含む変数に代替演算子が適用されます。- ここバナー包含は、
e
置換がPerlコードとして解釈され、e
置換を生成するために評価されることを意味します。 - また、この
s
フラグを使用して、.
通常使用したい改行と一致させます。rename
改行はファイル名のすべての文字と同じくらい有効なためです。これがwhichの\Z
代わりに(トピックの最後に一致)を使用する理由でもあります。ただし、トピックの末尾の改行文字の前にも使用できます。ただし、この場合、すべてのファイル名は改行文字ではなく改行文字で終わるため、影響はありません。$
perl
v
($3 =~ y/./ /r)
y
(別名)演算子をtr
3番目のキャプチャグループに適用します。この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
あるいは、スクリプトと同様に、perl
Perlスクリプトには複数のステートメントがあります(区切りまたは;
複数のオプションを使用)。たとえば、-e
rename
$ 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コードでもインストールされているuse
Perlモジュールでもかまいません。すべての文がファイル名を直接変更する必要はありません。たとえば、コードを使用してカウンタを増やしたり、stat
ファイル名に対して実行してサイズやタイムスタンプなどを確認したりできます。あるいは、データベースを照会するか、Web API呼び出しを介して調べることもできます。ファイル名にエピソードのタイトルがない場合)。変更すると、$_
ファイル名が変更されます。