Batch renomeando a série de TV

1

Minha biblioteca do iTunes está em um NAS (WD MyCloud 4TB), e eu tenho um número de séries de TV, organizado pela biblioteca do iTunes no habitual:

Pasta "Programas de TV":

TV Show 1

|------------- Series 1
               |-----------01 Episode Name.m4v
               |-----------02 Episode Name.m4v
               |...
|------------- Series 2
               |-----------01 Episode Name.m4v
               |...
|...
TV Show 2
|------------- Series 1
               |-----------01 Episode Name.m4v
               |-----------02 Episode Name.m4v
               |...
|------------- Series 2
               |-----------01 Episode Name.m4v
               |...
|...

Eu vinculei toda a pasta de TV a outra pasta, chamada Infuse. Essa pasta será lida pelo aplicativo Infuse no meu Apple TV [isso me permite evitar um computador com o iTunes permanentemente ligado], então preciso renomear todos os arquivos com link físico como tal:

TV Show 1
|------------- Series 1
               |-----------TV Show 1 - S0101 Episode Name.m4v
               |-----------TV Show 1 - S0102 Episode Name.m4v
               |...
|------------- Series 2
               |-----------TV Show 1 - S0201 Episode Name.m4v
               |...
|...
TV Show 2
|------------- Series 1
               |-----------TV Show 2 - S0101 Episode Name.m4v
               |-----------TV Show 2 - S0102 Episode Name.m4v
               |...
|------------- Series 2
               |-----------TV Show 2 - S0201 Episode Name.m4v
               |...
|...

Eu até agora encontrei a solução (por exemplo, o programa de TV 1, a pasta da primeira temporada):

cd em cada pasta de temporada para cada show e execução

for f in *; do mv $f "TV Show 1 E01S$f"; done

mas isso é realmente demorado, pois preciso

cd ../Season 2/
for f in *; do mv $f "TV Show 1 E02S$f"; done
cd ../Sesaon 3/

...

cd ../../TV Show 2/Season 1/
for f in *; do mv $f "TV Show 2 E01S$f"; done
...

e o ideal é criar um script para extrair o nome do diretório dos avós e o número da temporada do diretório pai para que eu possa escrever um pequeno script e executá-lo. Algo como:

#!/bin/bash
a=[TV Show folder]
b=[Season folder]
c=[each episode]

for c in each a/b/
mv $c "$a - S0$bE$c"    (or)   rename $c "$a - S0$bE$c"
done

Você pode me ajudar a implementá-lo com vários loops for ou comando específico?

    
por JamieO 09.08.2017 / 09:12

2 respostas

1

Tendo feito algo muito semelhante recentemente, eu já tinha um script.

for f in */*/*
do
  destdir=${f%/*}
  tvshow=${f%%/*}
  season=${destdir#*/}
  episode=${f##*/}
  # Get season number
  seasonnum=${season##* }

  dest=$(printf "%s/%s - S%02iE%s" "$destdir" "$tvshow" $seasonnum "$episode")
  echo "mv -- \"$f\" \"$dest\""
  # mv -- "$f" "$dest"
done
    
por 09.08.2017 / 11:20
1

com zsh :

autoload zmv # best in ~/.zshrc
zmv -n '(*)/(Series (<->))/(<->)(*)' '$1/$2/$1 - S${(l:2::0:)3}E${(l:2::0:)4}$5'

(remova -n quando feliz).

  • <-> é <x-y> para números x a y , mas sem x nem y fornecido, portanto, qualquer número (decimal).
  • ${(l:2::0:)var} : bloco esquerdo de largura 2 com 0 s

Mesmo com perl ' rename :

rename -n 's{./(.*)/Series (\d+)/\K\d+}{
             sprintf "%s - S%02dE%02d", $1, $2, $&}se' ./*/*/*
    
por 09.08.2017 / 11:19

Tags