파일 확장자 뒤의 모든 문자 제거

파일 확장자 뒤의 모든 문자 제거

다음과 같은 수십 개의 파일이 있습니다.

title.mkv]-[72+167] - "" yEnc  637005001 (1+889)

"이후의 모든 것"을 제거하고 싶습니다.mkv"

나에게 도움이 되는 몇 가지 정규식을 찾아보았지만 사용법을 이해할 수 없습니다.

누구든지 나를 도와줄 수 있나요?

답변1

rename의견은 prename다음을 참조하세요.

이 답변에서는 util-linux 형식이 아닌 Perl 변형을 사용하고 있습니다. 아니요:

$ rename --version
rename from util-linux 2.31.1

하지만:

$ rename --version
/usr/bin/rename using File::Rename version 0.20

또는 유사합니다.


Perl을 사용하여 이름 바꾸기:

rename 's/\.mkv.*/.mkv/s' ./*.mkv*

-n옵션을 먼저 사용하여 요구 사항을 충족하는지 확인하세요.

rename -n 's/\.mkv.*/.mkv/s' ./*.mkv*

간단히 말해서:

s/\.mkv.*/.mkv/s

예:

substitute/<THIS>/<WITH THIS>/s

\.mkv.*리터럴 포인트, \.문자열 mkv및 마지막으로 모든 문자( 플래그가 \n필요한 문자 포함 s)를 0회 이상 일치시킵니다 .*.

결과 .mkv<anything>는 로 대체됩니다 .mkv.


다음과 같이 표현식을 읽고 구성하는 데 도움이 되는 도구가 있습니다.https://regex101.com/

답변2

존재하다 bash:

for f in *; do [[ "$f" =~ ^.+\.mkv ]] && mv "$f" "${BASH_REMATCH[0]}"; done

답변3

그리고zsh~의zmv:

autoload zmv
zmv -v '(*.mkv)*' '$1'

삭제된 부분맨 오른쪽.mkv파일 이름에 항목이 있습니다( foo.mkv-bar.mkv-whatever로 이름이 변경됨 foo.mkv-bar.mkv).

~을 위한맨 왼쪽(파일 이름을 로 변경 ), "예외"를 사용하여 다음으로 끝나지만 뒤에 하나 이상의 문자가 없는 문자열을 일치 시켜 foo.mkv바꿀 수 있습니다.*.mkv*.mkv~*.mkv?*.mkv.mkv~글로벌 운영자.

답변4

스크립트 배쉬에서

#!/bin/bash
for i in *.mkv*
do
  j=$(echo "$i" | sed -e 's/\.mkv.*$/.mkv/')
  mv -- "$i" "$j"
done

관련 정보