Exceção de correspondência de padrões para o shell script

1

Portanto, tenho o seguinte shell script para renomear em lote os episódios de algumas séries de TV:

#!/bin/bash
#script for renaming files of form "*01*.ext" to "Episode 01.ext";
counter=0
for all_files in * ; do
  counter=$(( $counter+1  )) #increments $counter by 1;
  #creates counter "number" with two digit format (eg: 01):
  if [[ 1 = $(( $counter<10 )) ]] ; then
    number=0$counter
  else
    number=$counter
  fi
  #checks all file names for presence of $number and renames those files:
  for numbered_file in *$number* ; do 
    ext=${numbered_file##*.}
    mv "$numbered_file" "Episode $number.$ext"
  done
done

Agora quero melhorar o script para explicar algumas exceções bastante comuns. Em particular, eu não quero que o "20" em "720p" seja interpretado como se referindo ao "Episódio 20". O que eu quero, então, é uma maneira de refinar o padrão *$number* do loop for interno. ( number é uma variável atribuída a 01 , 02 , 03 e assim por diante.)

Como faço para alcançar algo nos moldes de:

* no "7" aqui $number no "0" ou "p" aqui *

Por favor, sinta-se livre para apontar qualquer outra coisa sobre o script acima que é feito sem jeito. É minha primeira tentativa de um roteiro vagamente útil e, como tal, é provavelmente cheio de monstruosidades estilísticas. ; -)

    
por Psachnodaimonia 19.09.2012 / 18:21

2 respostas

2

Parece que você está reinventando ferramentas existentes como mmv e rename - existem vários programas chamados rename , mas o que eu estou pensando é o renomear perl aka prename (está incluído com o pacote perl no debian e derivados, possivelmente outras distros também).

Eu fornecia alguns exemplos de uso para ambos, mas você não nos deu um exemplo dos nomes dos arquivos de origem (veja meu comentário acima).

BTW, uma vez que seu script é bash em vez de sh, você pode substituir seu if / then / else por zero-padding $ number com o bash-builtin printf assim:

printf -v number "%02d" "$counter"

No shell POSIX, você poderia usar number=$(printf "%02d" $counter) . O comando printf faz parte do GNU Coreutils.

    
por 20.09.2012 / 01:32
1

O Bash tem uma construção de correspondência de expressões regulares:

[[ $string =~ regexp ]]

Não é muita ajuda para o que você quer fazer, no entanto. Para extrair o número interessante do seu nome de arquivo, remova os bits chatos e mantenha a última seqüência não chata de dígitos.

shopt -s extglob
number=$filename
number=${number//[0-9][0-9]+([0-9])p}
number=${number%%+([^0-9])}
number=${number##*[^0-9]}
    
por 20.09.2012 / 03:01