다음과 같은 이름의 파일이 여러 개 있습니다.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"