Renomear vários arquivos remove todos os caracteres

2

Como posso substituir isso

[www.Example.com]Name-episode-77.mp4
FGBs episode 3 dks.mp4 

para

HxH 077.mp4
HxH 003.mp4

* O nome dos arquivos não segue o padrão exato

Eu quero: -

  • Remover todos os caracteres e símbolos
  • Número do formato de 3 a 003
  • Adicione uma string no início do nome do arquivo
por Tarek Mohamed Abdalla 20.10.2015 / 16:06

2 respostas

2

Este one-liner funciona para seus dados de exemplo:

for i in *; do echo "$i";mv "$i" $(echo "$i" | perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"'); done;

Explicação:

for i in *; 
do 
  echo "$i";
  mv "$i" $(echo "$i" | perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"'); 
done;

for i in *;do - > percorra todos os arquivos no diretório atual
echo "$i"; - > escreva o arquivo atual (veja progres / logging)% mv "$i" $(echo "$i" | perl -ne '($num)=$_=~/(\d+).*\.mp4/; print "HxH",sprintf("%03d",$num),".mp4","\n"'); - > renomeando o comando (nome original para a saída do comando perl) O comando perl extrai os dígitos do nome do arquivo e imprime "HxH", o número com os 0s iniciais e ".mp4"

Nota importante:

O comando dado funciona nas duas entradas de amostra fornecidas. Você deve testá-lo definitivamente antes de aplicá-lo aos seus arquivos reais. Portanto, eu recomendaria remover mv "$i" do comando. Então você pode validar os nomes.

    
por Wayne_Yux 20.10.2015 / 16:41
2

Outra possibilidade é usar rename (a versão perl, que é a padrão que vem com o Ubuntu) e uma expressão regular (RE):

rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4

Passo a passo:

  1. rename -vn dirá ( -v ) o que será renomeado, mas sem executá-lo ( -n );

  2. Para cada nome substituto ( s ), o primeiro RE com a segunda string, separado por / ;

  3. O primeiro RE corresponde a zero ou mais caracteres de maneira não-voraz ( .*? ), seguido por um ou mais dígitos ( [0-9]+ ), seguido por qualquer um; a correspondência de dígitos é salva no primeiro grupo graças aos parênteses ( (...) );

  4. A segunda string se expande para o comando perl sprintf("HxH %03d", $1) onde $1 é o primeiro grupo correspondido acima;

  5. O sinalizador e para o comando s diz que eu quero executar a expressão de substituição e usar o resultado, então o sprintf é executado e imprime o número em $1 em um campo de tamanho 3 com zeros à esquerda ( "%03d" );

  6. Por fim, aplique o comando rename em todos os arquivos que terminem em .mp4 ( *.mp4 ).

Veja:

% ls
FGBs episode 3 dks.mp4  [www.Example.com]Name-episode-77.mp4
% rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
FGBs episode 3 dks.mp4 renamed as HxH 003.mp4
[www.Example.com]Name-episode-77.mp4 renamed as HxH 077.mp4

Observe que isso é apenas uma execução de teste; renomeações não podem ser desfeitas ... vamos executar isso de verdade agora:

% rename -v 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4 
FGBs episode 3 dks.mp4 renamed as HxH 003.mp4
[www.Example.com]Name-episode-77.mp4 renamed as HxH 077.mp4
% ls
HxH 003.mp4  HxH 077.mp4

A expressão regular é realmente poderosa.

Observe que apenas o primeiro conjunto de números será usado:

% touch "Another serie 2 ep 34.mp4"
% rename -vn 's/.*?([0-9]+).*/sprintf("HxH %03d.mp4", $1)/e' *.mp4
Another serie 2 ep 34.mp4 renamed as HxH 002.mp4

Para evitar isso, estude, por exemplo, link e tenha cuidado com o "4" em "mp4" ...

Além disso, ele falhará se o nome contiver números no --- veja o comentário do @kos abaixo.

    
por Rmano 20.10.2015 / 20:22