次の名前のファイルが複数あります。This is a test - AB12-1998.avi
(最後のコードは常に文字2、数字2、ダッシュ、数字4です)
私がしたいのは、次のように名前を変更することです。AB12-1998 - This is a test.avi
bash、名前変更、または作業が完了する限り、他の方法を使用して私に提供できるソリューションに感謝します。
ベストアンサー1
Perlを使うrename
(*) :
rename 's/^(.*) - (.*)(\..*)$/$2 - $1$3/' *.avi
または、コードをより厳密に適用するには、次の手順を実行します。
rename 's/^(.*) - ([a-zA-Z]{2}\d{2}-\d{4})(\..*)$/$2 - $1$3/' *.avi
foo - bar - AB12-1234.avi
最初の名前が.*
最後の名前と一致するため、このような名前でも機能します<space><dash><space>
。
(*望むより:名前の変更、名前の変更、ファイルの名前変更など、すべての名前変更操作はどうなりますか?)
またはBashでも同様です。
for f in *.avi ; do
if [[ "$f" =~ ^(.*)\ -\ (.*)(\..*)$ ]]; then
mv "$f" "${BASH_REMATCH[2]} - ${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
fi
done
つまり、正規表現は次のように分類されます。
^ start of string
( ) capture group
.* any amount of anything
\. a literal dot
$ end of string
Bashでスペースをエスケープするにはバックスラッシュを使用する必要がありますが(上記のように)、ほとんどの一般的な文字はそれ自体が一致します。キャプチャリンググループの内容は Perl では等の順序で現れ$1
、 Bash では等の順序で現れます。$2
${BASH_REMATCH[1]}
${BASH_REMATCH[2]}