다른 캐릭터를 캡쳐한 후 모든 점을 바꾸는 방법

다른 캐릭터를 캡쳐한 후 모든 점을 바꾸는 방법

perl-rename일부 프로그램의 이름을 바꾸려면 이 명령을 사용하려고 합니다 . 현재 형식은 다음과 같습니다.

series.S01E**.title.of.the.episode.mkv

별표는 에피소드 번호의 자리 표시자입니다.

다음과 같이 이름을 바꾸고 싶습니다.

[Series] - S01E** - title of the episode.mkv

시리즈 이름과 에피소드 이름을 성공적으로 캡처했지만 무언가를 일치시킨 후 점을 바꾸는 방법을 모르겠습니다.

perl-rename 's/(\w+)\.(S\d{2}E\d{2})\./[\u$1] - $2 - /' -n *.mkv
                                     ^ No idea what to insert here

전화 한 통화 rename가 내 목표였습니다. 제목의 길이는 임의로 변할 수 있으므로 (\w+)\.(\w+).../$1 $2... # match a word and a dot정해진 횟수만큼 할 수는 없습니다.

내가 찾고 있는 것은 기본적으로 match 입니다 word..

답변1

노력하다:

perl-rename -n 's{(\w+)\.(S\d{2}E\d{2})\.(.*)(\.mkv)\Z}{
  "[\u$1] - $2 - " . ($3 =~ y/./ /r) . $4}es' ./*.mkv
  • perl구현 기반 rename(모두 다음에서 파생됨)rename스크립트perl(1989년 초에 Perl 3과 함께 제공됨), 인수로 제공된 파일의 이름을 $_첫 번째 인수에 제공된 코드의 수정된 값으로 바꿉니다.perl
  • s{regex}{replacement}flagss/regex/replacement/flags, 와 같은 약어입니다 $_ =~ s{regex}{replacement}flag. 즉, $_이름을 바꿀 파일의 이름이 포함된 변수 에 대체 연산자가 적용됩니다 .
  • 여기배너포함은 e대체가 Perl 코드로 해석되어 e대체를 생성하기 위해 평가됨을 의미합니다.
  • 또한 이 s플래그를 사용하여 .일반적으로 사용하려는 개행과 일치시킵니다. rename개행은 파일 이름의 모든 문자만큼 유효하기 때문입니다. 이것이 또한 which \Z대신에 (주제 끝에서 일치)를 사용하는 이유이기도 합니다 . 그러나 주제 끝의 개행 문자 앞에도 사용할 수도 있습니다. 그러나 이 경우 모든 파일 이름은 개행 문자 가 아닌 개행 문자 로 끝나기 때문에 아무런 영향을 미치지 않습니다 .$perlv
  • ($3 =~ y/./ /r)y(일명) 연산자를 tr세 번째 캡처 그룹에 적용합니다. 이 r플래그를 사용하면 대체가 내부에 적용되지 않지만( $3어차피 읽기 전용임) r대체 결과가 반환됩니다.

개인적으로 나는 대신 zsh'를 사용합니다 zmv.

autoload -Uz zmv
zmv -n '(*).(S<1-99>E<1-99>).(*)(.mkv)' '[${(C)1}] - $2 - ${3//./ }$4'

여기서 ${(C)1}이전 섹션의 각 단어(연속 번호)는 대문자로 표시됩니다 ./SXXEYY(예: foo.Bar-BAZ로 변경됨).Foo.Bar-Baz

이점 rename:

  • 구현은 단 하나뿐입니다(비록 수십 개의 변형이 있음 rename).
  • 이름을 바꾸기 전에 몇 가지 온전성 검사를 수행합니다(예 : series.S01E01.title x.mkvSerias.S01E01.title.x.mkv
  • rename--(모두 지원되지는 않음) 또는 접두사를 잊어버린 경우 ./일부 Perl 변형에는 임의 명령 주입 취약점이 있습니다 .
  • ASCII가 아닌 파일 이름(예: épisode대문자 Épisode)에서도 작동합니다.

답변2

sed또는 스크립트와 마찬가지로 perlPerl 스크립트에는 여러 문이 있을 수 있습니다( 로 구분되거나 ;여러 옵션을 사용함). 예를 들어:-erename

$ touch 'my.series.name.S01E'{01..03}'.title.of.the.episode.mkv'
$ ls -l
total 6
-rw-r--r-- 1 cas cas   0 Jun  7 10:56 my.series.name.S01E01.title.of.the.episode.mkv
-rw-r--r-- 1 cas cas   0 Jun  7 10:56 my.series.name.S01E02.title.of.the.episode.mkv
-rw-r--r-- 1 cas cas   0 Jun  7 10:56 my.series.name.S01E03.title.of.the.episode.mkv

$ rename 's/\./ /g; s/ (mkv)$/.$1/; s/^(.*) (S\d\dE\d\d) /[\u$1] - $2 - /' *.mkv
$ ls -l
total 6
-rw-r--r-- 1 cas cas   0 Jun  7 10:57 [My series name] - S01E01 - title of the episode.mkv
-rw-r--r-- 1 cas cas   0 Jun  7 10:57 [My series name] - S01E02 - title of the episode.mkv
-rw-r--r-- 1 cas cas   0 Jun  7 10:57 [My series name] - S01E03 - title of the episode.mkv

스크립트 이름 바꾸기:

  • .모든 문자( .mkv 확장자 앞의 문자 포함) 를 공백으로 바꿉니다.

  • 확장자 앞의 공백을 변경하세요 . 현재 이 기능은 .mkv 파일에만 작동하지만, 예를 들어 다른 컨테이너 형식의 비디오가 있는 경우 로 .쉽게 변경할 수 있습니다 .s/ (mkv)$/.$1/s/ (mkv|avi|mp4)$/.$1/

    예를 들어 여러 "확장자"가 있는 파일 이름을 처리해야 하는 경우 .xyz.mp4더 많은 작업이 필요하며 모든 확장자를 미리 알지 않는 한 에피소드 제목에서 단어와 "확장자"를 구별하기가 어렵습니다.

  • 파일 이름의 시리즈 이름과 에피소드 번호 부분을 로 다시 지정합니다 [Series] - SnnEnn -. 에피소드 제목과 확장자는 처음 두 명령 이후 그대로 유지됩니다.

[참고: 이러한 파일을 처리하는 다른 셸 스크립트를 작성하는 경우 파일 이름에 공백 과 문자 가 모두 포함되어 있으므로 파일 이름의 모든 변수를 큰따옴표로 묶어야 합니다 ]. 어쨌든 변수를 참조해야 하므로 이는 큰 문제가 아닙니다.

그런데 스크립트의 명령문은 rename유효한 Perl 코드일 수도 있고 use설치된 Perl 모듈일 수도 있습니다. 모든 명령문이 파일 이름을 직접 변경할 필요는 없습니다. 예를 들어 코드를 사용하여 카운터를 증가시키거나 stat파일 이름에 대해 실행하여 크기나 타임스탬프 등을 확인할 수도 있습니다. 또는 데이터베이스를 쿼리하거나 웹 API 호출을 통해 알아낼 수도 있습니다. 파일 이름에 에피소드 제목이 누락된 경우). 변경하면 $_파일 이름이 변경됩니다.

관련 정보