ファイル名の最後の部分を前に移動

ファイル名の最後の部分を前に移動

次の名前のファイルが複数あります。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]}

おすすめ記事