MMV 배치 파일 이름 바꾸기

MMV 배치 파일 이름 바꾸기

mmv 모드를 알 수 없습니다. 다음 패턴을 가진 비디오 파일이 많이 있습니다.

my.program.name.season.NN.episode.NN.-.title.avi

다음 위치로 이동해야 합니다.

my.program.name.sNNeNN.title.avi

패턴이 잘 안잡히는거 같은데..

답변1

긴 이야기 짧게

rename -n 's/^((\w+\.+){3})(.).*\.(.*)\.(.).*\.(.*)\.\-(\..*)$/$1$3$4$5$6$7/' *
  • \w+하나 이상의 단어 문자와 일치합니다(예: [a-zA-Z0-9_]+[1]) .
  • \.+하나 이상의 점( .) 문자와 일치합니다. [2]

    노트문자를 \.일치시킵니다 .. 정규식 \.에서 특별한 의미를 가지 려면 as를 사용해야 합니다. 이를 이스케이프 코드라고 하며 다음 문자의 원래 리터럴 의미를 복원합니다...\

  • (\w+\.+){3}^파일 이름의 시작 부분부터 시작하는 위의 [1], [2] 문자 그룹 중 최대 3배까지 일치합니다(이름의 시작 부분과 일치).
    일치하거나 반환됩니다.my.program.name.

    노트정규식 주위의 추가 괄호는 그룹화를 일치시키는 데 사용됩니다. 그룹 매칭은 다음으로 시작 (하고 끝나며 )소위 제공하는 데 사용됩니다.역참조. 역참조에는 특수 변수에 저장된 일치하는 하위 문자열이 포함됩니다.1,2달러,,$9여기서 $1에는 첫 번째 괄호 쌍과 일치하는 하위 문자열이 포함됩니다.

  • .메타 문자 점(.)은 모든 단일 문자와 일치합니다. 예를 들어 ...임의의 3개 문자를 일치시킵니다. 따라서 첫 번째 문자를 일치시키겠습니다 (.).seasons

  • .*\..첫 번째 문자가 나타날 때까지 위의 단일 문자 이후의 모든 항목과 일치합니다 . 보시다시피, 일치하는 이름에서 이를 제거하고 싶었기 때문에 일치 그룹으로 캡처하지 않았습니다 eason..

  • (.*)위의 일치 이후의 모든 항목과 일치합니다. 이는 NN파일 이름에 유지하려고 하므로 여기서는 괄호를 사용합니다.

  • \.위 경기 이후의 포인트와 일치합니다. 먼저 오는 것은 .나중에 온다 NN.

  • (.)이번에도 위 일치 항목 이후 첫 번째 단일 문자를 일치시킵니다. 이것은 단지 반환됩니다 e.

  • .*\.위의 일치 이후 첫 번째 일치까지 모든 항목을 일치시킵니다 .. 일치합니다 pisode..

  • (.*)위 일치 항목의 마지막 일치 지점 이후의 모든 항목과 일치합니다. 이것은 두 번째 것과 일치합니다 NN.

  • \.\-.다음에 대시가 오는 것과 일치합니다 -. 일치하거나 반환됩니다.-

  • 마지막으로 (\..*)$.과 그 뒤의 모든 항목을 파일 이름 끝까지 일치시킵니다. $파일 이름 또는 입력 문자열의 끝과 일치합니다.

참고: -n실제 이름 바꾸기를 수행하려면 옵션을 제거하십시오.

답변2

순수 BASH로 만들 수 있습니다.

netikras@netikras-netbook /tmp $ ls -l /tmp/*.*season.*episode.*avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.07.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.32.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.35.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.NN.episode.NN.-.title.avi

netikras@netikras-netbook /tmp $ for i in *.*season.*episode.*avi; do nn="${i/season./s}"; nn=${nn/.episode./e}; nn=${nn/.-./.}  ; echo "moving: $i ----> $nn"; mv $i $nn; done
moving: my.program.name.season.05.episode.07.-.title.avi ----> my.program.name.s05e07.title.avi
moving: my.program.name.season.05.episode.32.-.title.avi ----> my.program.name.s05e32.title.avi
moving: my.program.name.season.05.episode.35.-.title.avi ----> my.program.name.s05e35.title.avi
moving: my.program.name.season.NN.episode.NN.-.title.avi ----> my.program.name.sNNeNN.title.avi

이렇게 하면 작업을 수행하기 위해 외부 애플리케이션(예: sed/awk)을 호출할 필요가 없습니다. BASH를 사용하면 내장 도구를 사용하여 문자열을 쉽게 수정할 수 있습니다. 파일 이름의 세 부분을 바꾸고 새 파일을 생성하면 됩니다. 그런 다음 남은 것은 파일에 새 이름을 지정하는 것입니다. 간단한 작업을 수행하기 위해 이상해 보이는 정규식을 배울 필요가 없습니다.

답변3

Perl을 사용하여 이 작업을 수행해 보세요 rename.

rename -n 's/
            (.*?s)eason\.(\d{2})\.episode\.(\d{2})\.-\.(.*\.avi)
            /$1$2e$3.$4/x
' my.program.name*

원하는 효과가 만족스러우면 삭제하여 -n실제로 이름 바꾸기를 수행하세요.

관련 정보