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'
'하나모노가타리 ost Nattoku.mp3' => '나토쿠 하나모노가타리 ost.mp3'
'키즈모노가타리 ost Preface.mp3' => ' 서문 키즈모노가타리 ost.mp3'
' 키즈모노가타리 ost Reprise.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

관련 정보