movimentação do arquivo regex do Linux

2

Estou tentando mover arquivos para subpastas com base em uma expressão regular. Por exemplo estou tentando mover programas de TV para o show correto e pasta de temporada. Todos os arquivos seguem o padrão "Show Name.S00E00.episode title.avi".

Eu olhei para mmv e renomei mas não consigo encontrar nenhum exemplo útil.

Se alguém pudesse me apontar na direção certa, ficaria muito grato.

Editar: esqueci de mencionar que a estrutura da pasta é

./
   Unsorted video files 
   Show Name/
      Season 1/
           Video Files Sorted
      Season 2/
    
por AverageMarcus 11.06.2011 / 12:25

2 respostas

3

Para o shell bash :

for file in *.avi; do
    # use perl to transform the file name; could use 'sed -r' too
    new_path=$(perl -pe 's|^(.+?)\.S0*(\d+)E0*(\d+)\.(.+)\.(\w+)$|$1/Season $2/Episode $3 - $4.$5|' <<< "$file")
    # create directories if needed
    mkdir -p "${new_path%/*}"
    # move the file
    mv -vn "$file" "$new_path"
done

Neste exemplo de expressão regular ( s|...|...| ):

  • $1 é o nome do programa (tudo até " .S<num>E<num> ");
  • $2 e $3 são números de temporada / episódio;
  • $4 é o título do episódio (tudo até a final " . ");
  • $5 é a extensão do arquivo.

Se você deseja manter os zeros iniciais em números de temporada / episódio, substitua S0* e E0* apenas por S e E . Se você quiser processar outros tipos de arquivo, ajuste *.avi na primeira linha.

O Debian e o Ubuntu vêm com um script prename baseado em Perl que pode ser usado para isso, mas não cria novos diretórios automaticamente. É fácil modificá-lo para isso ; então você pode usar apenas prename 'the above regexp' *.avi .)

    
por 11.06.2011 / 12:53
0

Ou você pode usar somente comandos bash até o fim (se todos os seus arquivos realmente seguirem a estrutura que você forneceu):

for episode in *avi ; do
  ### cut $episode into fields, separated by "." and assign the first such field to $showname
  ### assign the second and third character of the second field to $season
  showname='echo $episode | cut -d "." -f1'
  season='echo $episode | cut -d "." -f2 | cut -c 2,3'
  ### create directory only if not already created
  mkdir -p $showname/$season
  ### move the file
  mv $episode $showname/$season/
done
    
por 07.03.2013 / 09:19