파일 이름의 마지막 부분을 앞으로 이동

파일 이름의 마지막 부분을 앞으로 이동

다음과 같은 이름의 파일이 여러 개 있습니다.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}에서 일치하는 가장 긴 접미사 문자열을 삭제 하고 에서 일치하는 가장 짧은 접두사 문자열을 삭제합니다. 따라서 코드는 첫 번째 발생 시 두 하위 문자열을 교체합니다(공백-대시-공백).word$parameter${parameter#word}word$parameter-

mv실제로 파일 이름을 바꾸려면 권장 콘텐츠를 제거하세요 .


댓글에서일카츄의 답변, 이름의 첫 부분도 바꾸길 원하시네요. 그래서 AB12-1998가 됩니다 1998-AB12.

이제 이름을 두 번 바꾸므로 이를 함수에 넣을 수 있습니다.

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"

관련 정보