私は今、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