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

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

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

答え2

使用/bin/sh:

for name in *.avi; do
    n=${name%.avi}    # name without filename extension
    first=${n%% - *}  # first part of name
    last=${n#* - }    # last part of name
    new="$last - $first.avi"  # recombined new name

    printf 'Would move "%s" to "%s"\n' "$name" "$new"
    # mv -- "$name" "$new"
done

${parameter%%word}で一致する最長のサフィックス文字列を削除し、 で一致する最短の接頭辞文字列を削除します。したがって、コードは最初の発生時に2つの部分文字列を置き換えます(スペース - ダッシュ - スペース)。word$parameter${parameter#word}word$parameter-

mv実際にファイル名を変更するには、推奨コンテンツを削除してください。


コメントからイルカチュウの答え、名前の最初の部分も変えたいですね。だからにAB12-1998なります1998-AB12

これで名前を2回変更するので、それを関数に入れることができます。

swap () {
    # swaps the two part of a string around
    # the swap point is defined by the first argument

    swstr=$1
    string=$2

    first=${string%%$swstr*}
    last=${string#*$swstr}

    printf '%s%s%s\n' "$last" "$swstr" "$first"
}

for name in *.avi; do
    n=${name%.avi}
    n=$( swap ' - ' "$n" )
    first=${n%% - *}
    first=$( swap '-' "$first" )
    new="$first - ${n#* - }.avi"

    printf 'Would move "%s" to "%s"\n' "$name" "$new"
    # mv -- "$name" "$new"
done

出力例:

Would move "This is a test - AB9-1995.avi" to "1995-AB9 - This is a test.avi"
Would move "This is a test - AB9-1996.avi" to "1996-AB9 - This is a test.avi"
Would move "This is a test - AB9-1997.avi" to "1997-AB9 - This is a test.avi"
Would move "This is a test - AB9-1998.avi" to "1998-AB9 - This is a test.avi"
Would move "This is a test - AB9-1999.avi" to "1999-AB9 - This is a test.avi"

関連情報