mmvモードが不明です。次のパターンを持つ多くのビデオファイルがあります。
my.program.name.season.NN.episode.NN.-.title.avi
次の場所に移動する必要があります。
my.program.name.sNNeNN.title.avi
パターンがうまくいかないようです。
答え1
長い話を短く
rename -n 's/^((\w+\.+){3})(.).*\.(.*)\.(.).*\.(.*)\.\-(\..*)$/$1$3$4$5$6$7/' *
\w+
1つ以上の単語文字と一致します(例:[a-zA-Z0-9_]+
[1])。\.+
1つ以上のドット(.
)文字と一致します。 [2]ノート文字を
\.
一致させます.
。正規表現\.
で特別な意味を持つには、asを使用する必要があります。これをエスケープコードといい、次の文字の元のリテラルセマンティクスを復元します。.
.
\
(\w+\.+){3}
^
ファイル名の先頭から始まる上記の[1]、[2]文字グループのうち最大3倍まで一致します(名前の先頭と一致)。
一致または返されます。my.program.name.
ノート正規表現の周りの追加の括弧は、グループ化を一致させるために使用されます。グループマッチングは、次から始めて
(
終了し、)
いわゆる提供に使用されます。逆参照。逆参照には、特殊変数に格納されている一致する部分文字列が含まれます。1、2ドル、…、$9ここで、$1 には、最初の括弧のペアと一致する部分文字列が含まれます。.
メタ文字ドット(.)は、すべての単一文字と一致します。たとえば、...
任意の3文字を一致させます。したがって、最初の文字を一致させます(.)
。season
s
.*\.
.
最初の文字が表示されるまで、上記の単一文字の後のすべての項目と一致します。ご覧のとおり、一致する名前から削除したいので、一致グループとしてキャプチャしませんでしたeason.
。(.*)
上記の一致以降のすべての項目と一致します。これはNN
ファイル名に保持したいので、ここでは括弧を使用します。\.
上記試合後のポイントと一致します。まず来るのは.
後で来るNN
。(.)
今回も、上記の一致から最初の単一文字を一致させます。これは返されますe
。.*\.
上記の一致から最初の一致まですべての項目を一致させます.
。一致しますpisode.
。(.*)
上記の一致の最後の一致点以降のすべての項目と一致します。これは2番目のものと一致しますNN
。\.\-
ドット.
の後にダッシュが来るのと一致します-
。一致または返されます.-
最後に、ドット
(\..*)$
と.
その後のすべてのエントリをファイル名の最後まで一致させます。$
ファイル名または入力文字列の末尾と一致します。
注:-n
実際の名前を変更するには、オプションを削除してください。
答え2
純粋なBASHで作ることができます。
netikras@netikras-netbook /tmp $ ls -l /tmp/*.*season.*episode.*avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.07.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.32.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.35.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.NN.episode.NN.-.title.avi
netikras@netikras-netbook /tmp $ for i in *.*season.*episode.*avi; do nn="${i/season./s}"; nn=${nn/.episode./e}; nn=${nn/.-./.} ; echo "moving: $i ----> $nn"; mv $i $nn; done
moving: my.program.name.season.05.episode.07.-.title.avi ----> my.program.name.s05e07.title.avi
moving: my.program.name.season.05.episode.32.-.title.avi ----> my.program.name.s05e32.title.avi
moving: my.program.name.season.05.episode.35.-.title.avi ----> my.program.name.s05e35.title.avi
moving: my.program.name.season.NN.episode.NN.-.title.avi ----> my.program.name.sNNeNN.title.avi
これにより、操作を実行するために外部アプリケーション(sed / awkなど)を呼び出す必要がなくなります。 BASHを使用すると、組み込みツールを使用して文字列を簡単に変更できます。ファイル名の3つの部分を変更して新しいファイルを作成します。次に残っているのは、ファイルに新しい名前を付けることです。簡単なタスクを実行するために奇妙に見える正規表現を学ぶ必要はありません。
答え3
Perlを使ってこれをやってみてくださいrename
。
rename -n 's/
(.*?s)eason\.(\d{2})\.episode\.(\d{2})\.-\.(.*\.avi)
/$1$2e$3.$4/x
' my.program.name*
目的の効果が満足のいくものであれば、削除して-n
実際に名前を変更してください。