TV 프로그램의 파일 이름을 S01E01.mp4 등으로 바꾸고 정리합니다.

TV 프로그램의 파일 이름을 S01E01.mp4 등으로 바꾸고 정리합니다.

이름이 잘못된 TV 프로그램이 있으면 정리해야 합니다.

$ ls
Some_Series.1_Episode.1.mp4  'Some Series01.Episode02.mp4' SomeSeries1Episode03.mp4

일괄적으로 이름을 다음으로 변경해야 합니다.

$ ls
S01E01.mp4  S01E02.mp4  S01E03.mp4

다음 스크립트를 사용했는데 작동하지만 원본 파일 이름에 1 2 3 대신 시리즈 및 에피소드 번호 01 02 03이 포함된 경우에만 작동합니다.

#!/bin/bash
# rename tv show filenames to be kodi friendly
cd /mnt/2tb_hd/con/
if [ $? == 1 ]; then 
    exit
fi
for filename in *; do
        if [[ "$filename" =~(\**).*(.*[0-9][0-9]).*([0-9][0-9]).*(\....)$ ]]; then
            result=$(echo mv \"$filename\" S${BASH_REMATCH[2]}E${BASH_REMATCH[3]}${BASH_REMATCH[4]}\") 

                if [[ $? == 0 ]] ; then 
                    mv "$filename" "S${BASH_REMATCH[2]}E${BASH_REMATCH[3]}${BASH_REMATCH[4]}"
                fi
            fi
        done
        exit

두 번째 이름 바꾸기 루프를 실행하기 전에 패딩이 0이 되도록 파일 이름의 1 2 3 4 5 등을 변경하거나 0 패딩에 관계없이 이미 01 또는 1을 변경해야 하는 코드를 변경해야 합니다.

뻔해 보인다면 죄송합니다. 하지만 저는 bash를 처음 접하는 사람이므로 양해해 주시기 바랍니다.


대본을 업데이트했는데 이제 에피소드 8과 9에 문제가 생겼습니다. 다음과 같은 오류가 발생합니다

line 10: printf: 08: invalid octal number

따라서 에피소드 8과 9는 누락되었지만 에피소드가 7개 이상인 각 시리즈에는 추가 파일 S02E00.mkv가 있습니다.

적응된 스크립트

#!/bin/bash
# rename tv show files to kodi friendly format S01E01 etc
cd /mnt/2tb_hd/Adults/TV_Shows/Breaking\ Bad/
if [ $? == 1 ]; then 
    exit
fi
reg='^([^0-9]*)([0-9][0-9]*)[^0-9]*([0-9][0-9]*).*(\....)$'
for filename in *.*; do
      if [[ $filename =~ $reg ]]; then
              printf -v newname 'S%02dE%02d%s' "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" "${BASH_REMATCH[4]}"
                  mv "$filename" "$newname"
                fi
            done
        exit

바라보다http://pastebin.com/2XRH85ua테스트 실행의 전체 결과를 얻으려면.

답변1

printf, 및 정수 및 제로 패딩의 필드 너비를 지정하는 형식 문자열을 사용합니다 .

printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"

$((10#${BASH_REMATCH[n]}))소수점 계산을 강제 하려면 다음을 사용하세요.09

테스트(그런데 정규식을 약간 수정했습니다):

reg='^([^0-9]*)([0-9][0-9]*)[^0-9]*([0-9][0-9]*)(\....)$'
for filename in *.mp4; do
  if [[ $filename =~ $reg ]]; then
    printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"
    echo mv "$filename" "$newname"
  fi
done
mv Some Series01.Episode02.mp4 S01E02.mp4
mv SomeSeries1Episode03.mp4 S01E03.mp4
mv Some_Series.1_Episode.1.mp4 S01E01.mp4


정규식을 사용하는 것이 더 강력할 수 있습니다.오직처음 두 자리 숫자 시퀀스와 일치하고 셸 매개변수 대체를 사용하여 확장자를 처리합니다.

reg='([0-9][0-9]*)[^0-9]*([0-9][0-9]*)'
for filename in *.mp4 *.mkv; do
  name="${filename%.*}"
  ext="${filename##*.}"
  if [[ $name =~ $reg ]]; then
    printf -v newname 'S%02dE%02d.%s' "$((10#${BASH_REMATCH[1]}))" "$((10#${BASH_REMATCH[2]}))" "${ext}"
    echo mv "$filename" "$newname"
  fi
done
mv Some Series01.Episode02.mp4 S01E02.mp4
mv SomeSeries09Episode10.mp4 S09E10.mp4
mv SomeSeries1Episode03.mp4 S01E03.mp4
mv Some_Series.1_Episode.1.mp4 S01E01.mp4
mv Breaking.Bad.S01E01.576p.BluRay.DD5.1.x264-HiSD.mkv S01E01.mkv

또는 시스템에 Perl 기반 rename/ prename명령이 있는 경우 다음을 수행할 수 있습니다.

prename -vn -- 's/.*(\d+).*(\d+)/sprintf "S%02dE%02d.mp4", $1, $2/e' *.mp4

관련 정보