이름이 잘못된 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