Linux/ubuntu で名前ファイルを並べ替える

Linux/ubuntu で名前ファイルを並べ替える

私は今、bashスクリプトやrename、sed、正規表現などのコマンドを使用していくつかの(1〜300)音楽のタイトルを変更しようとしていますが、失敗しました。おそらく、プログラミングとターミナルコマンドという言葉が初めてだからです。助けが必要な部分は次のとおりです。

曲のパターンは次のとおりです
文字列1 文字列2 文字列3.mp3 '
例:
'バケモノガタリ エルステッド 同級生.mp3 '
'キズナモノカタリ エルステッド 地獄のサタモケイン時代.mp3

'文字列1常にサフィックス「monogatari」で終わりますが、これがこの文字列を検索する方法だと思います。
これ文字列2大文字を使用または使用しないことがあります。
これ文字列3は曲の実際の名前なので、名前の間にスペースがある可能性があります。
観察 1. 私はどちらかを選ぶ方法を考える文字列1そして文字列3渡される文字列2、以前は何でしたか?文字列3はい文字列1そしてそれに続くのは文字列2はい文字列3
観察2.拡張子は同じままであることを覚えておいてください。

'予想入力' => '予想出力'

'バケモノガタリー Ost Classmate.mp3' => '同級生 バケモノガタリー Ost.mp3'
'バケモノガタリー Ost Date.mp3' => '日付バケモノガタリー Ost.mp3'
「バケモノガタリーOst Dokuzetsu.mp3」=>「ドクジェツバケモノガタリーOst.mp3」「バケモノガタリー
Ost Kedamono.mp3」=>「ケダモノバケモノガタリーOst.mp3
」 '=> 'NATOKU花物語ost.mp3'
'キッズ物語ost Preface.mp3' =
> '序文キッズ物語ost.mp3' ost.mp3 '
'小物ヶ谷ost地獄の佐田茂志台.mp3' => '地獄野茂茂 葛飾小物荘 ost.mp3' '小井物荘 ost なまけもののせくばたらき.mp3
' = > 「なまけもののせくばたらきこいものがた ost.mp3」 「ニセモノガタリ
ost Bangs.mp3」 => 「バンスニセモノガタリ ost.mp3」 「ニセモノガタリ
ost Story.mp3」 => 「ストーリーニセモノガタリost Bangs.mp3 '
'ニセモノガタリーost Unrest.mp3' => 'ニセモノガタリーost Unrest.mp3'

ユーザー43791の解像度:

#!/bin/bash
# You can adjust the pattern "*.mp3" to match a different file extension or a different directory if needed - user43791
for i in *.mp3; do
    # Keep the path - user43791
    p="$(dirname "$i")"

    if [[ ${i##*/} =~ ^(.*gatari)\ +([Oo]st)\ +(.*)(\.[^.]+)$ ]]; then
        # Content of BASH_REMATCH: - user43791
        # [1] from start until the end of monogatari - user43791
        # [2] Ost or ost - user43791
        # [3] Everything after ost/Ost until (and not including) the last dot - user43791
        # [4] The extension (.mp3) - user43791
    mv "$i" "$p/${BASH_REMATCH[3]} ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}${BASH_REMATCH[4]}"
    fi

    #I repeated the loop for the others patterns that i finded after the response by user43791 in the files - Rodrigo

    if [[ ${i##*/} =~ ^(.*iro)\ +([Oo]st)\ +(.*)(\.[^.]+)$ ]]; then
    mv "$i" "$p/${BASH_REMATCH[3]} ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}${BASH_REMATCH[4]}"
    fi
    if [[ ${i##*/} =~ ^(.*uro)\ +([Oo]st)\ +(.*)(\.[^.]+)$ ]]; then
    mv "$i" "$p/${BASH_REMATCH[3]} ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}${BASH_REMATCH[4]}"
    fi
    if [[ ${i##*/} =~ ^(.*II)\ +([Oo]st)\ +(.*)(\.[^.]+)$ ]]; then
    mv "$i" "$p/${BASH_REMATCH[3]} ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}${BASH_REMATCH[4]}"
    fi
    if [[ ${i##*/} =~ ^(.*lll)\ +([Oo]st)\ +(.*)(\.[^.]+)$ ]]; then
        mv "$i" "$p/${BASH_REMATCH[3]} ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}${BASH_REMATCH[4]}"
    fi
    if [[ ${i##*/} =~ ^(.*eason)\ +([Oo]st)\ +(.*)(\.[^.]+)$ ]]; then
        mv "$i" "$p/${BASH_REMATCH[3]} ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}${BASH_REMATCH[4]}"
    fi
done

答え1

唯一のbash答えは、仕様に応じて次のように簡単に解決できます。

# You can adjust the pattern "*.mp3" to match a different file extension or a different directory if needed
for i in *.mp3; do
    # Keep the path
    p="$(dirname "$i")"

    if [[ ${i##*/} =~ ^(.*monogatari)\ +([Oo]st)\ +(.*)(\.[^.]+)$ ]]; then
        # Content of BASH_REMATCH:
        # [1] from start until the end of monogatari
        # [2] Ost or ost
        # [3] Everything after ost/Ost until (and not including) the last dot
        # [4] The extension (.mp3)
        mv "$i" "$p/${BASH_REMATCH[3]} ${BASH_REMATCH[1]} ${BASH_REMATCH[2]}${BASH_REMATCH[4]}"
    fi
done

注:このコードはすべてテストされていません。echo実行する前に前に配置して機能していることを確認してください。mv

関連情報