次の構文を使用するビデオファイルがたくさんあります。
TV.Show.Title.SXEY.Episode.Title.1080p.Uploader.mkv
これはSXEY
定数ではありません。ファイルによって異なりますX
。Y
名前を次に変更したいです。
TV Show Title - SXEY - Episode Title.mkv
これを行うには、rename
次のコマンドを使用します。
rename 's/\./\ -\ /;s/\./\ -\ /;s/\.(?!mkv)/\ /g;s/1080p.*(?=\.mkv)//g' *.mkv
このコマンドは最初に最初の2つの点をに変換し、他のすべての␣-␣
点を空白に変換し、最後にエピソードのタイトルの終わりとファイル拡張子の間のすべての内容を削除します。
これがどのように改善されるのか、どのようなアイデアがありますか?正規表現を使って最初の2点を変換する方法があると思います。私はrename
それがGNUユーティリティであると信じているので、すべてのUnixシステムには存在せず、より移植可能な代替策を探しています。
答え1
この質問は実際にそれに関するものであり幸いですregex
。同じ質問をして頭が痛くならないようにしたいです。
for m in *.mkv;
do echo mv $m "$(awk -F'.' '{
printf "%s %s %s - %s - %s %s.%s", $1, $2, $3, $4, $5, $6, $(NF)}' <<<$m)";
done
出力文字列は予測可能で読みやすく、修正が容易です。ただ削除してくださいecho
編集する
以下のコメントに関してsed
同じ技術を使用し、代わりに出力用のファイル名を処理できますsed
。awk
for m in *.mkv;
do echo mv $m "$(sed 's/\./ /1;s/\./ /1;s/\./ - /1;s/\./ - /1;s/\./ /1;s/\..*\././' <<<$m)";
done
答え2
次のことができます。
$ rename -n 's/.(S\d+E\d+)./ - $1 - /; s/\./ /g; s/\.1080p.+\././' *mkv
TV.Show.Title.SXEY.Episode.Title.1080p.Uploader.mkv -> TV Show Title - SXEY - Episode Title 1080p Uploader mkv
または、次のようなものかもしれません。
$ rename -n 's/1080p.*\.//; s/\.(?!mkv)/ /g; s/S\d+E\d+/- $& -/' *mkv
TV.Show.Title.SXEY.Episode.Title.1080p.Uploader.mkv -> TV Show Title - SXEY - Episode Title.mkv
スペースを脱出する理由がないことに注意してください。したがって、正規表現ロジックで実際に何も変更せずにコマンドを単純化できます。
rename 's/\./ - /;s/\./ - /;s/\.(?!mkv)/ /g;s/1080p.*(?=.mkv)//g' *.mkv
.mkv
ただし、これにより不要な項目の前にスペースが追加されます(元のバージョンでもこれが行われます)。おそらくこれは:
rename -n 's/\./\ -\ /;s/\./\ -\ /;s/\.(?!mkv)/\ /g;s/ 1080p.*(?=.mkv)//g' *.mkv
より移植性の高いソリューションが必要な場合は、次のものを使用できますperl
(perlはほとんどすべての* nixシステムでは使用できませんが)。
perl -e 'for (@ARGV){$n=$_;s/1080p.*\.//;s/\.(?!mkv)/ /g;s/S\d+E\d+/- $& -/; rename($n,$_)}' *mkv
移植性を最大化するには、シェルですべての操作を行います(少しsed
)。
for f in *mkv; do
k=${f//./ }
k=$( printf '%s' "$k" | sed 's/S\([0-9][0-9]*E[0-9][0-9]\)/ - \1 -/')
k=${k/ 1080p*/.mkv}
mv -- "$f" "$k"
done
重要なヒント:あなたがやろうとしていることはとても悪い考えです。ファイル名にスペースが含まれていると、操作がより難しくなり、後でそのファイルに対して実行したいすべての種類のタスクがより困難になります。もう一度考えてみてください。
答え3
努力する:
rename -v -n \
's/\./ /g;s/S[X0-9]*E[Y0-9]*/- $& -/;s/ \d*p .* mkv$/.mkv/' *.mkv
出力は何が起こるかを示すテスト実行を提供しますが、ファイルはまだ移動されていません。
rename(TV.Show.Title.SXEY.Episode.Title.1080p.Uploader.mkv,
TV Show Title - SXEY - Episode Title.mkv)
出力が良く見える場合は、-v -n
midから削除してください。s
デリゲート私のものになるアドホック可能性の低いデモ文字列を処理する方法「SXEY」、(変更する《S02E23》またはその他)次に変更してくださいs/S\d*E\d*/- $& -/
。
rename 's/\./ /g;s/S\d*E\d*/- $& -/;s/ \d*p .* mkv$/.mkv/' *.mkv
メモ:
\
一重引用符 ""を使用する場合は、 ""などのスペースをエスケープする必要はありません' '
。上記のコードは
.
すべてのsを空白に置き換えて、次のものを探します。Sイ・サンチャン/第二piode文字列を削除してから、最後のファイル拡張子を復元します.mkv
。これにより、固定長のエピソードや番組のタイトルは不要になります。
答え4
ユーティリティがグループキャプチャをサポートしているかどうかはわかりませんが、それを使用することは実行可能な戦略になります。
([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)
それからあなたは使うでしょう
$1 $2 $3 - $4 - $5 $6.$7
この戦略の利点は、実際には異なる命名スキームの意味を解決し、フィールドの順序を変更または省略できることです。可能であれば、文字グループを使用して文字をエスケープすることをお勧めします。[.]
。\.