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개 문자를 일치시킵니다. 따라서 첫 번째 문자를 일치시키겠습니다(.)
.season
s
.*\.
.
첫 번째 문자가 나타날 때까지 위의 단일 문자 이후의 모든 항목과 일치합니다 . 보시다시피, 일치하는 이름에서 이를 제거하고 싶었기 때문에 일치 그룹으로 캡처하지 않았습니다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
실제로 이름 바꾸기를 수행하세요.